Reputation: 583
Let's say my dictionary looks like this:
{
"432701228292636694" : {
"64AEdcb" : {
"inviter" : "282764296075870208",
"uses" : 40
},
"9WVmh3Q" : {
"inviter" : "173219378492473345",
"uses" : 26
},
"AE8ugEN" : {
"inviter" : "285548207189000204",
"uses" : 4
},
"EmCddbN" : {
"inviter" : "193926566881918978",
"uses" : 2
},
"GKnPWyW" : {
"inviter" : "147756076299845632",
"uses" : 1
},
"JnmyFKE" : {
"inviter" : "173219378492473345",
"uses" : 10
},
"Km4wZTz" : {
"inviter" : "161132853256650752",
"uses" : 9
},
"M8uYMNb" : {
"inviter" : "193896125969858561",
"uses" : 8
},
"e9vTXcz" : {
"inviter" : "273852837988007936",
"uses" : 1
},
"gTB7w4R" : {
"inviter" : "327660257423917066",
"uses" : 1
},
"hG2KyZa" : {
"inviter" : "315630485114191872",
"uses" : 2
},
"pdZNPFa" : {
"inviter" : "141431182792458241",
"uses" : 537
},
"rZwH4QF" : {
"inviter" : "384664458628169728",
"uses" : 4
},
"s9FXVAU" : {
"inviter" : "125092433657593856",
"uses" : 2
},
"wrPbkGz" : {
"inviter" : "277605262486011904",
"uses" : 3
}
}
}
I want to add up the totals for every key that has the same inviter
to get a combined total of uses
. In the data above, inviter
"173219378492473345" keys with uses of 26 and 10. I want to be able to combine that as 36.
How can I achieve this? I am able to write a list comprehension statement that can get me the value of each, but adding them together and getting a total is where I get lost.
The code below is what I've already written:
codes = sorted(self.invites_db[server.id], key=lambda x: (self.invites_db[server.id][x]['uses']), reverse=True)
inviters = [server.get_member(self.invites_db[server.id][x]['inviter']).name + "#" + server.get_member(self.invites_db[server.id][x]['inviter']).discriminator for x in codes if self.invites_db[server.id][x]['inviter'] != "141431182792458241"]
uses = [self.invites_db[server.id][x]['uses'] for x in codes if self.invites_db[server.id][x]['inviter'] != "141431182792458241"]
This will give me a list of all inviters
and uses
, but I don't want to have two identical inviter
s. Instead I want them to be added together as one. How can I do that so that I can them use zip
to show this data side-by-side in text format?
Upvotes: 3
Views: 88
Reputation: 140178
collections.Counter
for those kind of "count me or zero" stuff / accumulation problems (that you cannot solve with list comprehensions):
result = collections.Counter()
for subdict in d["432701228292636694"].values():
result[subdict["inviter"]] += subdict["uses"]
result:
>>> result
{'125092433657593856': 2,
'141431182792458241': 537,
'147756076299845632': 1,
'161132853256650752': 9,
'173219378492473345': 36,
'193896125969858561': 8,
'193926566881918978': 2,
'273852837988007936': 1,
'277605262486011904': 3,
'282764296075870208': 40,
'285548207189000204': 4,
'315630485114191872': 2,
'327660257423917066': 1,
'384664458628169728': 4}
Upvotes: 2
Reputation: 106553
Assuming your dict is stored as variable d
:
o = {}
for s in d.values():
for i in s.values():
o[i['inviter']] = o.get(i['inviter'], 0) + i['uses']
o
would become:
{'125092433657593856': 2,
'141431182792458241': 537,
'147756076299845632': 1,
'161132853256650752': 9,
'173219378492473345': 36,
'193896125969858561': 8,
'193926566881918978': 2,
'273852837988007936': 1,
'277605262486011904': 3,
'282764296075870208': 40,
'285548207189000204': 4,
'315630485114191872': 2,
'327660257423917066': 1,
'384664458628169728': 4}
Upvotes: 0
Reputation: 22503
Wouldn't it be a good time to use a simple dictionary?
uses = {}
for _,v in test["432701228292636694"].items():
if v["inviter"] in uses:
uses[v["inviter"]] += v["uses"]
else:
uses[v["inviter"]] = v["uses"]
print (uses)
{'282764296075870208': 40, '173219378492473345': 36, '285548207189000204': 4, '193926566881918978': 2, '147756076299845632': 1, '161132853256650752': 9, '193896125969858561': 8, '273852837988007936': 1, '327660257423917066': 1, '315630485114191872': 2, '141431182792458241': 537, '384664458628169728': 4, '125092433657593856': 2, '277605262486011904': 3}
Upvotes: 0