在列表中查找重复项

4

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

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

我想循环遍历列表,如果标签相同,则对numpy.arrays进行求和。因此,鉴于上面的示例中有两个 'red' 实例,期望的结果将是相同的列表但是:

('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个回答

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

以你的例子为例。

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


0

你可以添加一行

if i==p: 
  continue

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接