如果我有这样的清单:
[('apple', 5), ('banana', 9), ('apple', 3), ('orange', 1), ('banana', 2)]
我想输出这个人:
[('apple', 8), ('banana', 11), ('orange', 1)]
最顺畅的方法是什么?
答案 0 :(得分:2)
您可以使用defaultdict(int)或者来自集合的计数器
from collections import defaultdict
counts = defaultdict(int)
for fruit, count in fruits:
counts[fruit] += count
fruit_counts = counts.items()
您也可以使用Counter
:
from collections import Counter
counts = Counter
for fruit, count in fruits:
counts[fruit] += count
fruit_counts = counts.most_common()
如果您需要保留原始订单,可能需要使用OrderedDict:
from collections import OrderedDict
counts = OrderedDict()
for fruit, count in fruits:
counts.setdefault(fruit, 0)
counts[fruit] += count
fruit_counts = counts.items()
我用a number of ways to count items in a list in Python撰写了一篇文章。
答案 1 :(得分:1)
当然,将值存储在字典中,并在找到更多相同的键时累积它:
acc_items = {}
for fruit, count in items:
# if the fruit is in the dictionary then add count to its value, else the value for fruit is count
acc_items[fruit] = acc_items.get(fruit, 0) + count
print(acc_items.items())
答案 2 :(得分:1)
您还可以使用groupby
中的itertools
和dict
这样的示例:
my_list = [('apple', 5), ('banana', 9), ('apple', 3), ('orange', 1), ('banana', 2)]
b = dict()
for k, v in groupby(my_list, lambda x : x[0]):
try:
b[k] = b[k] + list(v)[0][1]
except KeyError:
b[k] = list(v)[0][1]
final = [(k, v) for k, v in b.items()]
输出:
print(final)
>>> [('apple', 8), ('banana', 11), ('orange', 1)]
答案 3 :(得分:0)
(define OBJ1 (make-obj 1
(make-act (= var1 var2) "start-rain")))
答案 4 :(得分:0)
这是我做的东西 - 对我来说似乎是最顺利的。嗯......它至少是最短的,可能还很快。
import pandas as pd
a_agg = [tuple(row) for row in pd.DataFrame(a).groupby(0, as_index=False)[1].sum().values]
感谢您的所有输入。我希望有一些纯粹的python(没有导入),但在这方面最好的方法似乎只是使用字典。