我有这个元组列表[(amount, name)]
:
[(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]
我试图通过他们的名字来比较它们,如果有一个具有相同名称的元组,我想将这些数量加在一起。
输出将进入另一个具有相同结构[(amount,name)]
的列表。
我设法用这个提取名称部分:
for i in range(0, len(spendList)):
print(spendList[i][1])
输出:
Charlie
Ben
Charlie
如何将名称相互比较?
答案 0 :(得分:3)
text = [(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]
dictionary = {}
for val in text:
amount, name = val
if name in dictionary:
dictionary[name] += amount
else:
dictionary[name] = amount
print(*dictionary.items(),sep="\n")
>>('Charlie', 427.93)
('Ben', 153.57)
答案 1 :(得分:3)
执行这些操作的一种方法是使用dict.setdefault()
,如:
data = [(214.05, 'Charlie'), (153.57, 'Ben'), (213.88, 'Charlie')]
summed = {}
for amount, name in data:
summed.setdefault(name, []).append(amount)
summed = [(sum(amounts), name) for name, amounts in summed.items()]
print(summed)
首先定义dict object
以累积每个名称的金额。
summed = {}
逐步浏览每一对金额和名称:
for amount, name in data:
使用dict
属性,哈希相同的内容将最终出现在dict的同一个插槽中,dict
方法:setdefault()
以确保dict我们遇到的每个名字都有一个空列表,为每个名称创建一个金额列表:
summed.setdefault(name, []).append(amount)
这会创建一个列表,如:
{'Charlie': [214.05, 213.88], 'Ben': [153.57]}
最后使用comprehension
我们可以sum()
更新所有具有相同名称的项目。
summed = [(sum(amounts), name) for name, amounts in summed.items()]
[(427.93, 'Charlie'), (153.57, 'Ben')]
答案 2 :(得分:2)
首先对列表进行排序,然后使用带有小lambda函数的itertools.groupby
:
from itertools import groupby
lst = [(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]
lst = sorted(lst, key=lambda x: x[1])
for k,v in groupby(lst, key = lambda x: x[1]):
amount = sum(x[0] for x in v)
print("Name: {}, Amount: {}".format(k, amount))
哪个收益
Name: Ben, Amount: 153.57
Name: Charlie, Amount: 427.93
或者,使用 dict理解 时更短:
summary = {name: amount
for name, v in groupby(lst, key = lambda x: x[1])
for amount in [sum(x[0] for x in v)]}
print(summary)
# {'Charlie': 427.93, 'Ben': 153.57}
答案 3 :(得分:2)
您可以使用collections.defaultdict
对每个名称的金额进行分组,然后在结尾处汇总金额:
from collections import defaultdict
data = [(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]
d = defaultdict(list)
for amount, name in data:
d[name].append(amount)
print([(_, sum(v)) for _, v in d.items()])
# [('Charlie', 427.93), ('Ben', 153.57)]