【问题标题】:seraching every element of a list for only one time只搜索列表的每个元素一次
【发布时间】:2019-07-09 15:32:25
【问题描述】:

我想创建一个成分汇总,但我不知道如何忽略元素,我已经数过了...

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

来源看起来像:

<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() 是添加 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])

但这不起作用...

【问题讨论】:

  • Lukas,您的代码清单中是否显示了虚假标记?那么,请您edit您的问题并稍微清理一下吗?

标签: python list search


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2021-12-22
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多