在列表中查找重复项

时间:2014-04-09 09:34:41

标签: python numpy

我有一个包含以下值的列表

h = [
    ('red', array([50, 344])),
    ('blue', array([15, 55])),
    ('green', array([1, 1])),
    ('orange', array([3, 7])),
    ('red', array([1, 1]))
]

如果标签相同,我想循环遍历列表并对numpy.arrays求和。因此,鉴于上面的示例,因为有两个“红色”实例,所需的结果将是相同的列表,但

('red', array([ 50, 344])) + ('red', array([1, 1])) = ('red', array([51, 345]))

我尝试过像

这样的嵌套循环
for i in range(0, len(h)):
    for p in range(0, len(h)):
        if (h[i][0] == h[p][0]):
            A = h[i][1] + h[p][1]

但是,此代码还会将实例h[i][0]的值与自身相加,但我不希望这样。我想做以下事情 - 对于每个实例,如果没有我自己的其他实例的标签是相同的,那么将它们添加到我而不添加我自己的价值。我希望这很清楚

2 个答案:

答案 0 :(得分:4)

我建议使用字典来执行此操作:

out = {}
for colour, array_ in h:
     if colour in out:
         out[colour] += array_
     else:
         out[colour] = array_

然后,您可以将列表作为out.items()返回给我。

[('blue', array([15, 55])), ('orange', array([3, 7])), 
 ('green', array([1, 1])), ('red', array([ 51, 345]))]

为你的例子。

这个单循环比现在的双循环更有效,因为它只处理列表中的每个项目一次。

答案 1 :(得分:0)

您可以添加一行

if i==p: 
  continue

此外,范围函数中的0,可以省略,因为它始终从0开始。