在元组列表中对常用术语进行分组并对相关值求和

时间:2016-12-20 23:09:41

标签: python

如果我有这样的清单:

[('apple', 5), ('banana', 9), ('apple', 3), ('orange', 1), ('banana', 2)]

我想输出这个人:

[('apple', 8), ('banana', 11), ('orange', 1)]

最顺畅的方法是什么?

5 个答案:

答案 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中的itertoolsdict这样的示例:

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(没有导入),但在这方面最好的方法似乎只是使用字典。