As I said, the problem is that you are overwriting your value at a key every time a duplicate key pops up. This can be fixed two ways:
- You can do a check before adding a new value and if the key already exists, append to the already existing list.
For example:
#change these lines
new={lead_id:[month,pid,year]}
    charges.update(new)
#to
if lead_id in charges:
    charges[lead_id].extend([month,pid,year])
else
    charges[lead_id] = [month,pid,year]
Which gives you a structure like this:
charges = {
    '123':[month1,pid1,year1,month2,pid2,year2,..etc]
    }
With this approach, you can reach each separate entry by chunking the value at each key by chunks of 3 (this may be useful)
However, I don't really like this approach because it requires you to do that chunking. Which brings me to approach 2.
- Use defaultdict from collectionswhich acts in the exact same way as a normaldictwould except that it defaults a value when you try to call a key that hasn't already been made.
For example:
#change
charges={}
#to
charges=defaultdict(list)
#and change
new={lead_id:[month,pid,year]}
    charges.update(new)
#to
charges[lead_id].append((month,pid,year))
which gives you a structure like this:
charges = {
    '123':[(month1,pid1,year1),(month2,pid2,year2),(..etc]
    }
With this approach, you can now iterate through each list at each key with:
for key in charges:
     for entities in charges[key]:
         print(entities) # would print `(month,pid,year)` for each separate entry
If you are using this approach, dont forget to from collections import defaultdict. If you don't want to import external, you can mimic this by:
if lead_id in charges:
    charges[lead_id].append((month,pid,year))
else
    charges[lead_id] = [(month,pid,year)]
Which is incredibly similar to the first approach but does the explicit "create a list if the key isnt there" that defaultdict would do implicitly.