Python 如果邻居相等,则合并已排序的列表成员列表
如果我有以下列表Python 如果邻居相等,则合并已排序的列表成员列表,python,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
[[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])]
您很接近,您可以使用压缩分组的数字,然后使用函数将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]]
但作为一种更具蟒蛇风格的方法,您可以使用:
我可能会用字典来解释:
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)
您应该得到一个
类型错误:不支持+:'int'和'list'的操作数类型。
是的。为什么呢?y
不应该是第二个职位的分组成员吗?
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)