我们有一个清单:
import numpy as np
A=[(2, 2, 0), (1, 5, 0), (6, 8, 0), (2, 2, 2) ]
ax=np.asarray([row[0] for row in A])
ay=np.asarray([row[1] for row in A])
az=np.asarray([row[2] for row in A])
print (ax,ay,az)
我想比较ax与ay,当我找到相等的对,其中ax == ay喜欢(2,2,0)和(2,2,2)我保持一对,但添加az值。所以在我们的例子中,新的通缉名单B将是:
B=[(2, 2, 2), (1, 5, 0), (6, 8, 0)]
如果有一些代码对于真正庞大的列表也会很有效,那将是很好的。
答案 0 :(得分:1)
如果订单不重要
from collections import defaultdict
dd = defaultdict(int)
for x, y, z in A:
dd[(x,y)] += z
res = [k + (v,) for k, v in dd.iteritems()]
# [(1, 5, 0), (6, 8, 0), (2, 2, 2)]
如果订单很重要
from operator import itemgetter
d = {}
for idx, (x, y, z) in enumerate(A):
pos, freq = d.get((x,y), (0,0))
d[(x,y)] = min(pos, idx), freq + z
res = sorted((k + (v[1],) for k, v in d.iteritems()), key=itemgetter(1, 1))
# [(2, 2, 2), (1, 5, 0), (6, 8, 0)]