python3 汇总列表列表中的元素

python3 summarize elements form list of lists

我有一个列表列表

lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]

我想为相等的第一项汇总子列表的第二项。结果应该看起来像

lst = [[0,1],[1,6],[3,6]]

我试过这样的事情:

lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in range(len(lst)):
    first=listitem[0]
    second = 0
    for obj in lst:
        if obj[0] == first:
            second += obj[1]
            lst.remove(obj)
    listitem[1] = second

另一种思考方式是,每对中的第一项是 key,第二项是 value——所以如果你创建一个 dict,你然后可以在遇到每个键时将值加在一起——如果使用 defaultdict:

会更容易
from collections import defaultdict

summary = defaultdict(int)
for sublist in lst:
    key, value = sublist
    summary[key] += value

print(summary.items())

summary[key] += value 行是这里的主力。它的作用:

  • 总结一下key
  • 如果不存在则添加它并使用int创建默认值
  • return 值(已经存在或新创建)
  • 为其添加新值
  • 将其存储回 key
  • 下的 summary

使用默认字典

    from collections import defaultdict

    lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]

    res = defaultdict(int)    
    for el in lst:
        res[el[0]] += el[1] 
    res_list = [[k,v] for (k,v) in res.items()]

    print(res_list)

[[0, 0.25], [1, 0.25], [2, 0.125], [3, 0.09375], [4, 0.03125]]

groupby returns 键和具有相同键的项目的迭代器。它必须传递一个按相同键排序的列表:

from itertools import groupby
from operator import itemgetter

lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]

result = [[k,sum(b for a,b in g)]
           for k,g in groupby(sorted(lst),key=itemgetter(0))]

print(result)

输出:

 [[0, 1], [1, 6], [3, 6]]

range(n) 生成一个列表,例如 [0,1,2...n-1],因此 listitem 的类型是 int 而不是 list.

lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in lst:
    first = listitem[0]
    second = 0
    for obj in lst:
        if obj[0] == first:
            second += obj[1]
            lst.remove(obj)
    listitem[1] = second