[英]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.