python3汇总元素表单列表

时间:2015-12-09 08:00:16

标签: python list python-3.x sublist

我有一份清单

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

4 个答案:

答案 0 :(得分:3)

使用defaultdict

    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]]

答案 1 :(得分:3)

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

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]]

答案 2 :(得分:1)

考虑这一点的另一种方法是每对中的第一项是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创建默认值
  • 返回值(已经存在或新创建)
  • 将新值添加到其中
  • 将其存储回summary
  • 下的key

答案 3 :(得分:0)

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