2 回答

TA貢獻1982條經驗 獲得超2個贊
您收到錯誤是因為您向 提供了單獨的數字min(),并且min想要一個iterable諸如 a 的數字list。我們該如何解決這個問題?假設你有一本像這樣的字典:
mydict = {"produce": [
? ? {
? ? ? ? "name": "carrot",
? ? ? ? "type": "vegetable",
? ? ? ? "price": 10.0,
? ? ? ? "units": "KG"
? ? },
? ? {
? ? ? ? "name": "potato",
? ? ? ? "type": "stem tuber",
? ? ? ? "price": 2.0,
? ? ? ? "units": "KG"
? ? },
? ? {
? ? ? ? "type": "fruit",
? ? ? ? "price": 5.0,
? ? ? ? "units": "KG"
? ? }
]}
拿
produce?=?mydict['produce']
是時候構建列表理解了!
您想要迭代列表中的項目produce
。
[for?m?in?produce]
然后,您想要檢查該類型是否在某些字符串集中。
[for?m?in?produce?if?m.get('type')?in?{'stem?tuber',?'fruit'}]
然后,您想要提取其價格。如果不存在價格,則 0 似乎是合理的默認值!
[m.get('price',?0)?for?m?in?produce?if?m.get('type')?in?{'stem?tuber',?'fruit'}]
然后你想找到最小值
min([m.get('price',?0)?for?m?in?produce?if?m.get('type')?in?{'stem?tuber',?'fruit'}])
您還可以去掉周圍的方括號m.get(...)
,它就成為一個生成器表達式
關于。?“如何處理列表理解中沒有莖塊莖或水果類型記錄的情況”:
您可以將另一個項目添加到列表中,如下所示:
min([m.get('price',?0)?for?m?in?produce?if?m.get('type')?in?{'stem?tuber',?'fruit'}]?+?[-1])
據推測,沒有任何成本為 -1(0 是最小值)。那么如果你得到-1,你就知道沒有匹配的東西。

TA貢獻1828條經驗 獲得超4個贊
您將單獨的價格提供給min
,這是行不通的。相反,提供可迭代的價格。您可以使用生成器表達式:
low = min(
? ? m['price']
? ? for m in produce
? ? if m.get('type') in {'stem tuber', 'fruit'}
? ? )
print(low)? # -> 2.0
如果它可以幫助您更好地理解,這就像使用列表理解然后將列表輸入到min,但更直接。
prices = [
? ? m['price']
? ? for m in produce
? ? if m.get('type') in {'stem tuber', 'fruit'}
? ? ]
low = min(prices)
print(low)? # -> 2.0
要處理沒有匹配價格的情況,請將min部分包裝在try塊中并使用except ValueError。舉例來說,讓我們使用現有數據,但假設您正在尋找葫蘆的最低價格:
try:
? ? low = min(
? ? ? ? m['price']
? ? ? ? for m in produce
? ? ? ? if m.get('type') in {'gourd'}
? ? ? ? )
except ValueError:
? ? print('No matching prices')
? ? import sys
? ? sys.exit(1)
添加回答
舉報