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