繁体   English   中英

Python中的字典循环有一些错误

[英]Having some errors with Loops of dictionaries in Python

我想制作一个酒菜单程序,提供1)名称和2)酒的价格(如果客户使用Python 3输入酒的名称)。为此,我制作了一个包含字典的酒单,如下所示。

wine = [
{'Origin': 'A', 'Name': 'w1', 'price': 10000},
{'Origin': 'B', 'Name': 'w2', 'price': 2000},
{'Origin': 'C', 'Name': 'w3', 'price': 4000},
{'Origin': 'D', 'Name': 'w3', 'price': 55000},
{'Origin': 'E', 'Name': 'w2', 'price': 63000},
{'Origin': 'F', 'Name': 'w6', 'price': 80000}
]

wish_wine = input('Insert the wine what you want to have : ')

我正在尝试实现的算法如下:

1)尝试搜索列表中的所有元素,是否有客户想要的葡萄酒:

2)如果在列表中,请返回所有结果及其名称和价格。

3)如果列表中没有葡萄酒,则打印“对不起,没有葡萄酒...”消息

for i in range(len(wine)):
    if wish_wine in wine[i]['Name']:
        print('wine', wine[i]['Name'], 'is', wine[i]['price'], '$'.)
else:
    print('Sorry, there is no wine what you want.')

这是我现在编写的代码,在3)的情况下效果很好,但即使在2)的情况下,它也显示“对不起,没有酒...”的消息。

谢谢!

您缺少一个break语句或一个标志,表明您已找到结果。

同样,您可以直接在酒单上进行迭代,而不是遍历range(len(wine)) ,而酒单会在每次迭代中返回单个酒。 这将使您的代码更具可读性,可维护性和效率:

wines_found = False
for w in wine:
    if wish_wine in w['Name']:
        print('wine', wine['Name'], 'is', wine['price'], '$'.)
        wines_found = True

if not wines_found:
    print('Sorry, there is no wine what you want.')

请记住,如果您的酒名是“ Merlot”,并且M in "Merlot"勾选M in "Merlot"您会发现它通过了。 如果您有多种以M开头的葡萄酒,这将成为一个问题。

如果希望避免这种情况, if wish_wine in w['Name']中的if wish_wine == w['Name']if wish_wine == w['Name'] ,并添加一个break

也许您专门打算使用这种类似于JSON的数据结构,但是您是否考虑了哈希表查找架构?

>>> wine = [
...     {'Origin': 'A', 'Name': 'w1', 'price': 10000},
...     {'Origin': 'B', 'Name': 'w2', 'price': 2000},
...     {'Origin': 'C', 'Name': 'w3', 'price': 4000},
...     {'Origin': 'D', 'Name': 'w3', 'price': 55000},
...     {'Origin': 'E', 'Name': 'w2', 'price': 63000},
...     {'Origin': 'F', 'Name': 'w6', 'price': 80000}
... ]
>>> 
>>> wine_dict_lookup = {row['Name']: {'Origin': row['Origin'], 'price': row['price']} for row in wine}
>>> wine_dict_lookup
{'w1': {'Origin': 'A', 'price': 10000}, 'w2': {'Origin': 'E', 'price': 63000}, 'w3': {'Origin': 'D', 'price': 55000}, 'w6': {'Origin': 'F', 'price': 80000}}
>>> wish_wine = input('Insert the wine what you want to have : ')
>>> try:
...     print('wine', wish_wine, 'is', wine_dict_lookup[wish_wine]['price'], '$')
... except KeyError:
...     print('Sorry, there is no wine what you want.')
... 
wine w1 is 10000 $

这个问题非常适合哈希表,例如字典。 虽然,如果您打算if wish_wine in wine[i]['Name']:if wish_wine in wine[i]['Name']:用作一种模糊查找工具(即,能够匹配“ I want w1 ”之类的字符串,则这两种方法之间的性能可以忽略不计。

使用字典的真正好处是查找为O(1) ,这意味着相对于您拥有多少种不同的葡萄酒,它是恒定时间的。 您的列表查找为O(n) ,其中n是您的酒单中的元素数,因为您要遍历潜在的所有酒以找到某人想要的酒。

您可以使用collections.defaultdict来重组字典,以按酒名排序。 仅当您要查找完全匹配的名称时,此方法才有效。

from collections import defaultdict

wine_d = defaultdict(list)

for item in wine:
    wine_d[item['Name']].append(item)

然后访问输入葡萄酒名称的信息很简单:

wish_wine = input('Insert the wine what you want to have : ')

print(wine_d.get(wish_wine, 'No wine found'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM