我所遇到的问题与使用Python"中元组中每个给定第一个值的元组中的" Sum第二个值有关。和#34;如何在Python中的元组列表中对每个元组中的第一个值求和?"主题,但我无法从他们中提取我的问题的解决方案。 我想对每个元组的第三个条目求和,它在元组的第一个和第二个条目中包含相同的模式。 可以说,有一个包含整数的数组,描述了x轴的bin位置。此外,还有一个包含整数的数组,用于描述y轴的bin编号。第三个数组包含相应的" weigths"。
假设
ix = [0,1,2,0,1] and
iy = [0,1,1,0,1] and
w = [1,2,3,4,5]
使用" zip"我从那些数组中创建了元组,导致:
[0,0,1]
[1,1,2]
[2,1,3]
[0,0,4]
[1,1,5]
如上所述,我想要总和所有元组的第三个条目,如果前两个条目是相同的,在这种情况下"描述2D空间中的相同位置" 因此,输出应该是以下三个n元组:
[0,0,5]
[1,1,7]
[2,1,3]
如何实现这一目标? 谢谢你,最诚挚的问候,Marc
答案 0 :(得分:1)
Counter
的意思是(大部分);他们简单计算:
from collections import Counter
ix = [0,1,2,0,1]
iy = [0,1,1,0,1]
w = [1,2,3,4,5]
counts = Counter()
for (key, count) in zip(zip(ix, iy), w):
counts[key] += count
print "Counts:", counts
counts_as_list = [ # Conversion of the counting result (counts) to a list
[key[0], key[1], total_count] for (key, total_count) in counts.iteritems()]
print "As a list:", counts_as_list
给出
Counts: Counter({(1, 1): 7, (0, 0): 5, (2, 1): 3})
As a list: [[0, 0, 5], [1, 1, 7], [2, 1, 3]]
PS :ferhat elmas的collections.defaultdict(int)
解决方案也很好。但是,使用上面的Counter
有一个好处,就是明确表示你在计算事物 - 以及使用一个标准类来做这件事。此外,通常,您最终可能会使用计数器的特殊功能。出于所有这些原因,我建议在Counter
上使用defaultdict(int)
(即使它是某种不那么差的人Counter
)。
答案 1 :(得分:0)
defaultdict
很好地满足您的需求:
>>> from collections import defaultdict
>>> res = defaultdict(int)
>>> for p in zip(w, *[ix, iy]):
res[p[1:]] += p[0]
defaultdict(<type 'int'>, {(0, 0): 5, (1, 1): 7, (2, 1): 3})
答案 2 :(得分:-1)
迭代数组并比较第1和第2个值,如果等于则加上。
同时标记已经使用过的那些。
@EOL感谢您的评论。
arrays = [[0, 0, 1], [1, 1, 2], [2, 1, 3], [0, 0, 4], [1, 1, 5]]
new = []
for i,a in enumerate(arrays):
for j,b in enumerate(arrays[i+1:]):
if a[0] == b[0] and a[1] == b[1]:
#print a,b,(a[2] + b[2])
a.append('added')
b.append('added')
new.append([a[0],a[1],a[2] + b[2]])
if 'added' not in a:
new.append(a)
print new
输出
[[0, 0, 5], [1, 1, 7], [2, 1, 3]]