1

我们有一个清单:

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)]

如果有一些代码对非常大的列表也很有效,那就太好了。

4

2 回答 2

2

字典(或 collections.Counter)比 numpy 数组检查当前项目更快。

因此,如果输出顺序不重要:

from collections import Counter
c = Counter()
A = [(2, 2, 0), (1, 5, 0), (6, 8, 0), (2, 2, 2) ]
for a in A:
    c[a[:2]] += a[2]
B = [list(k) + [v] for k,v in c.iteritems()]

B就是现在:

[[1, 5, 0],  [6, 8, 0], [2, 2, 2]]
于 2012-07-27T11:07:54.717 回答
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)]
于 2012-07-27T12:22:06.287 回答