如果我有以下列表清单,
[[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])]
答案 0 :(得分:3)
即将结束,您可以使用zip
压缩分组的数字,然后使用map
功能在您的对上应用set
和sum
:
>>> 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()]