只搜索列表的每个元素一次

时间:2019-07-09 15:32:25

标签: python list search

我想创建一个成分摘要,但是我不知道该如何忽略元素,我已经算过...

试图删除访问过的元素,但以索引错误结束

源看起来像:

<br>
1.[(Ing1,350grams),(Ing4,200grams)]<br>
2.[(Ing2,2000grams),(Ing1,250grams),(Ing7,50grams),(Ing5,100grams)]<br>
3.[(Ing1,100grams),(Ing7,120grams)]<br>
4.[(Ing3,80grams),(Ing5,70grams),(Ing1,90grams)]<br>
...

这些应导致:

<br>
Ing1:790grams<br>
Ing2:2000grams<br>
Ing3:80grams<br>
Ing4:200grams<br>
Ing5:170grams<br>
Ing7:170grams<br>

我尝试了以下代码: (进食是ing对象的列表,getName()是字符串形式的名称,add()是将ings的值相加的函数)

    # eating is my list of ing objects
    new_eating = []
    for i in range(0,len(eating)):
        for j in range(i,len(eating)):
            if (i != j) and (eating[i].getName() == eating[j].getName()):
                eating[i] = eating[i].add(eating[j])
        new_eating.append(eating[i])

但这不起作用...

1 个答案:

答案 0 :(得分:0)

我建议使用dict对象。与其将所有内容都保存为列表,不如将它们作为键/值对保存,其中键是成分的名称,并将其映射到总计。然后,您可以使用成分名称来合并相同成分的值。

此外,使用defaultdict会在您第一次尝试访问它们时将它们全部设置为0。

注意,我不知道您的成分类型如何工作,所以这是伪python

from collections import defaultdict

ingredient_totals = defaultdict(lambda ingredient_name : [new ingredient with ingredient_name, and 0 amount])

for ingredient in eating:
    ingredient_totals[ingredient.getName()].add(ingredient)

new_eating = list(d.values())
# Maybe sort new_eating