【发布时间】:2015-11-26 01:52:01
【问题描述】:
[('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
例如,我有上面的元组列表,我如何找到重复项(即“Visa”)并将它们的值求和(即 980.5+215.0)?输出应该是:
[('Visa', 1195.5), ('Rogers', 61.5)]
【问题讨论】:
标签: python list python-3.x
[('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
例如,我有上面的元组列表,我如何找到重复项(即“Visa”)并将它们的值求和(即 980.5+215.0)?输出应该是:
[('Visa', 1195.5), ('Rogers', 61.5)]
【问题讨论】:
标签: python list python-3.x
使用字典:
>>> data = [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
>>> result = {}
>>> for card, value in data:
total = result.get(card, 0) + value
result[card] = total
>>> print result.items()
[('Visa': 1195.5), ('Rogers': 61.5)]
【讨论】:
看来大家都忘了collections.Counter:
from collections import Counter
c = Counter()
for card, val in lst:
c[card] += val
print(list(c.items()))
# [('Visa', 1195.5), ('Rogers', 61.5)]
【讨论】:
lst 不是一对可迭代的;如果您有一个 list 或 str 并试图计算唯一字符串,而不是 tuples 的 list 代表一个键和关联的数值,您会看到该错误;使用 list 的任何值都是包含两个值的可迭代值会导致问题,导致此问题的常见错误是当它是 str 的 list 时(循环试图解包)。如果您要计算单个项目的 list,而不是键 + 数值,则只需执行 c = Counter(lst) 即可。
collections.defaultdict 将是最有效的方式:
from collections import defaultdict
l= [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
d = defaultdict(float)
for k,v in l:
d[k] += v
输出:
defaultdict(<class 'float'>, {'Visa': 1195.5, 'Rogers': 61.5})
【讨论】:
data = [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
sum = {}
for item in data:
if not item[0] in sum:
sum[ item[0] ] = 0
sum[ item[0] ] += item[1]
print sum.items()
【讨论】:
list(sum.items()) 会解决问题。 (sum.items() 不是列表。)
使用集:
li=[('Rogers', 10), ('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
s=set([i[0] for i in li])
x=[]
for i in s:
sum=0
for j in li:
if i == j[0]:
sum+=j[1]
x.append(sum)
final_list=zip(s,x)
print final_list
输出:
[('Visa', 1195.5), ('Rogers', 61.5)]
【讨论】:
如果您想保持列表的顺序,那么我建议您不要使用字典。
lst = [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
lst2 = [(tup[0], sum([val for n, val in lst if n == tup[0]])) for tup in lst]
res = []
for tup in lst2:
if tup not in res:
res.append(tup)
print(res)
【讨论】: