使用Python将元组中前两个值的给定对的元组中的第三个值求和

时间:2015-03-10 11:38:20

标签: python tuples

我所遇到的问题与使用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

3 个答案:

答案 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]]