如果邻居相等,则合并列表成员的排序列表

时间:2015-04-09 15:49:12

标签: python

如果我有以下列表清单,

[[212, -217], [210, -488], [210, 46]]

我想合并它们,以便添加第一个成员相等的列表的第二个成员,并合并条目,因此输出将是:

[[212, -217], [210, -442]]

最好的方法是什么?我的尝试在下面,但这失败了因为y似乎总是空的:

d = [[212, -217], [210, -488], [210, 46]]
from itertools import groupby
ret = [[x, sum(y)] for x, y in groupby(d, key=lambda x: x[0])]

3 个答案:

答案 0 :(得分:3)

即将结束,您可以使用zip压缩分组的数字,然后使用map功能在您的对上应用setsum

>>> from operator import itemgetter
>>> [map(sum,map(set,zip(*g))) for _,g in groupby(sorted(d, key=itemgetter(0)),key=itemgetter(0))]
[[210, -442], [212, -217]]

但作为一种更强大的 pythonic 方式,您可以使用collections.defaultdict

>>> from collections import defaultdict
>>> dic=defaultdict(int)
>>> for i,j in d:
...   dic[i]+=j
... 
>>> dic.items()
[(210, -442), (212, -217)]

答案 1 :(得分:1)

我可能只是使用字典:

srclist = [[212, -217], [210, -488], [210, 46]]

dstdict = {}
for key, val in srclist:
    dstdict[key] = dstdict.get(key, 0) + val

dstlist = [[key, val] for key, val in dstdict.iteritems()]

print dstlist # [[210, -442], [212, -217]]

它并不像单行一样优雅,但它可以解决问题,我认为它可以清楚地说明代码正在做什么。

如果要保留原始列表的顺序,请遍历查看第一个条目的原始列表,并根据字典中的值附加到新列表:

dstlist = []

used_keys = []
for key, val in srclist:
    # If we've already added this key to the dstlist, then don't add it again
    if key in used_keys:
        continue
    else:
        dstlist.append([key, dstdict[key]])
        used_keys.append(key)

答案 2 :(得分:-1)

from collections import OrderedDict
l = [[212, -217], [210, -488], [210, 46]]
d = OrderedDict()
for i in l:
    if i[0] in d:
        d[i[0]] += i[1]
    else:
        d[i[0]] = i[1]

l = [[k, v] for k, v in d.items()]