删除重复的值并将相应的列值相加

Vin*_*M S 5 python list duplicates

我有一个列表,我需要从中删除重复值并汇总相应的列值.清单是:

lst = [['20150815171000', '1', '2'],
       ['20150815171000', '2', '3'],
       ['20150815172000', '3', '4'],
       ['20150815172000', '4', '5'],
       ['20150815172000', '5', '6'],
       ['20150815173000', '6', '7']]
Run Code Online (Sandbox Code Playgroud)

现在我需要遍历列表并获得如下输出:

lst2 = [['20150815171000', '3', '5'], 
        ['20150815172000', '12', '15'], 
        ['20150815173000', '6', '7']]
Run Code Online (Sandbox Code Playgroud)

怎么可以这样做?我尝试编写如下所示的代码,但它只是比较连续的值而不是所有匹配的值.

    lst2 = []
    ws = wr = power = 0
    for i in range(len(lst)):
        if lst[i][0] == lst[i+1][0]:
            time = lst[i][0]
            ws = (float(lst[i][1])+float(lst[i+1][1]))
            wr = (float(lst[i][2])+float(lst[i+1][2]))      
        else:
           time = lst[i][0]
           ws = lst[i][1]
           wr = lst[i][2]
        lst2.append([time, ws, wr, power])
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我知道我该怎么做?

Ana*_*mar 5

我会使用itertools.groupby,基于内部列表中的第一个元素进行分组.

所以我首先根据第一个元素对列表进行排序,然后基于它对组进行排序(如果列表已经在该元素上排序,那么您不需要再次排序,可以直接分组).

示例 -

new_lst = []
for k,g in itertools.groupby(sorted(lst,key=lambda x:x[0]) , lambda x:x[0]):
    l = list(g)
    new_lst.append([k,str(sum([int(x[1]) for x in l])), str(sum([int(x[2]) for x in l]))])
Run Code Online (Sandbox Code Playgroud)

演示 -

>>> import itertools
>>>
>>> lst = [['20150815171000', '1', '2'],
...        ['20150815171000', '2', '3'],
...        ['20150815172000', '3', '4'],
...        ['20150815172000', '4', '5'],
...        ['20150815172000', '5', '6'],
...        ['20150815173000', '6', '7']]
>>>
>>> new_lst = []
>>> for k,g in itertools.groupby(sorted(lst,key=lambda x:x[0]) , lambda x:x[0]):
...     l = list(g)
...     new_lst.append([k,str(sum([int(x[1]) for x in l])), str(sum([int(x[2]) for x in l]))])
...
>>> new_lst
[['20150815171000', '3', '5'], ['20150815172000', '12', '15'], ['20150815173000', '6', '7']]
Run Code Online (Sandbox Code Playgroud)

  • 很高兴它对你有效.我还想请你接受答案,(点击答案左侧的刻度线).这对社区有帮助. (3认同)