【问题标题】:How to iterate on dictionary composed of lists of tuples?如何迭代由元组列表组成的字典?
【发布时间】:2020-04-01 01:33:39
【问题描述】:

我想这应该是基本的......

我如何迭代我的成分

我有一个由元组列表组成的字典,如下所示:

   menu = {
        'breakfast menu': [('eggs', 'milk', 'tomato', 'bread'), ('pancake', 'syrup', 'berries', 'coffee'), ('cereal', 'milk'),
                         ('chicken', 'rice', 'cucumber', 'orange juice')],
        'lunch menu': [('steak', 'potatoes', 'red wine'), ('fish', 'chips',
                                                           'beer'), ('spaghetti', 'sauce', 'salmon'),
                       ('burger', 'buns', 'tomato', 'lettuce')],
        'diner menu': [('omelet', 'cheese', 'tuna', 'bread'), ('cookies', 'milk')]}

我尝试这样做如下:

for food in menu:
    for meal in food:
        for ingredient in meal:
            print(menu[food][meal][ingredient])

我得到的异常:

Traceback (most recent call last):
  File "C:/Users/liore/PycharmProjects/manu/test.py", line 12, in <module>
    print(menu[food][meal][ingredient])
TypeError: list indices must be integers or slices, not str

提前致谢:)

【问题讨论】:

  • 尝试打印mealingredient的值会得到错误原因。

标签: python-3.x dictionary iteration


【解决方案1】:

使用生成器表达式:

gen = (i for m in menu.values()
     for f in m
     for i in f)
for i in gen:
    print(i)

生产原料的地方

eggs
milk
tomato
bread
pancake
syrup
berries
coffee
cereal
milk
chicken
rice
cucumber
orange juice
steak
potatoes
red wine
fish
chips
beer
spaghetti
sauce
salmon
burger
buns
tomato
lettuce
omelet
cheese
tuna
bread
cookies
milk

你的想法是正确的,但是 python 允许直接访问你想要迭代的对象的元素。 这消除了通过在对象上索引来访问此类元素的需要,尽管该选项始终可用。

Python 的基本关键特性是协议(例如迭代、上下文等)和命名空间(即变量和名称、范围规则、类等)

在这个特定的案例中,我使用了一个生成器,它通过在菜单(字典)、每餐(食物列表)和每一种食物(配料元组)上迭代来生成配料.

注意:生成器可以被迭代,即它也是一个迭代器。

好的方面是它在不创建另一个数据结构的情况下产生成分,它只是驱动通过数据源(即它迭代它)。

问题是它只能迭代一次,因为它是一个迭代器而不是一个可迭代对象(如字典、列表和元组)。

如果您需要再次使用成分的顺序,您可以将生成器表达式转换为列表或将其创建为列表推导式

【讨论】:

  • 很好的解决方案!你能用几句话解释一下吗?谢谢
  • 如果我没记错的话,g 最终将是成分的元组,然后在最后一个 for 循环中,他正在打印所有成分。
  • 已编辑,很高兴能提供帮助。坚持下去,会更轻松! :)
【解决方案2】:

你可以试试:

>>> for k,v in menu.items():
...     for item in v:
...             print(f'{k} - [{item}]')
...
breakfast menu - [('eggs', 'milk', 'tomato', 'bread')]
breakfast menu - [('pancake', 'syrup', 'berries', 'coffee')]
breakfast menu - [('cereal', 'milk')]
breakfast menu - [('chicken', 'rice', 'cucumber', 'orange juice')]
lunch menu - [('steak', 'potatoes', 'red wine')]
lunch menu - [('fish', 'chips', 'beer')]
lunch menu - [('spaghetti', 'sauce', 'salmon')]
lunch menu - [('burger', 'buns', 'tomato', 'lettuce')]
diner menu - [('omelet', 'cheese', 'tuna', 'bread')]
diner menu - [('cookies', 'milk')]

要获得所有成分,您也可以试试这个:

>>> from itertools import chain
>>> for item in chain(menu.values()):
...     print(item)

...
[('eggs', 'milk', 'tomato', 'bread'), ('pancake', 'syrup', 'berries', 'coffee'), ('cereal', 'milk'), ('chicken', 'rice', 'cucumber', 'orange juice')]
[('steak', 'potatoes', 'red wine'), ('fish', 'chips', 'beer'), ('spaghetti', 'sauce', 'salmon'), ('burger', 'buns', 'tomato', 'lettuce')]
[('omelet', 'cheese', 'tuna', 'bread'), ('cookies', 'milk')]

【讨论】:

    【解决方案3】:

    我想这就是你要找的 -

    for myMenu in menu:
        for ingredient in menu[myMenu] :
            for individualIngredient  in ingrient:
                 print(individualIngredient)
    

    示例响应

    鸡蛋
    牛奶
    番茄
    面包
    煎饼
    糖浆
    浆果
    咖啡
    麦片
    牛奶

    大米
    黄瓜
    橙汁
    牛排
    土豆
    红酒

    芯片
    啤酒
    意大利面
    酱汁
    三文鱼
    汉堡
    包子
    番茄
    生菜
    煎蛋卷
    奶酪
    金枪鱼
    面包
    饼干
    牛奶

    【讨论】:

    • 谢谢!实际上我正在尝试以字符串而不是元组的形式访问每种成分,但是您的解决方案对我来说很好:)
    • 你可以再做一个循环,如下所示 - for indvidualIng in ingredients: print(indvidualIng )
    猜你喜欢
    • 2012-07-15
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2021-02-09
    相关资源
    最近更新 更多