在列表中搜索每个元素只有一次

2024-09-29 00:19:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个成分的摘要,但我不知道如何忽略elments,我已经计算了。。。你知道吗

试图删除访问过的元素,但最后出现索引错误

来源如下:

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

我试过这些代码: (eating是一个ing对象的列表,getName()是字符串形式的名称,add()是一个函数,用于添加ing对象的值)

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

但这不管用。。。你知道吗


Tags: 对象inbraddnewforinggetname
1条回答
网友
1楼 · 发布于 2024-09-29 00:19:10

我建议使用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

相关问题 更多 >