Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果邻居相等,则合并已排序的列表成员列表_Python - Fatal编程技术网

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)