![](/img/trans.png)
[英]Python: get key with the least value from a dictionary BUT multiple minimum values
[英]Get key with minimum value on a dictionary that contains 'None' / 'False' values
我的項目是一個基本的漫游人工智能。 當它的意識范圍內有食物時,它就會朝它走去。 如果它有不止一種食物,它應該選擇最近的。
我將食物作為鍵存儲在 dict 上,分配給鍵的值是到所述食物的最后已知距離。 然后我用最小距離檢查食物的字典,以便朝着它前進。
問題是超出范圍的食物被分配了值 None (也嘗試過 False),並且在使用時
min(self.vision, key=self.vision.get)
它返回找到的第一個具有 None/False 值的鍵。 通過在在線編譯器上進行測試,我發現在較舊的 python 版本上有這個錯誤:
類型錯誤:無法排序的類型:NoneType() < float()
我想現在認為 None 類型總是小於數字(也用整數測試)。
我正在嘗試組合 lambdas、過濾器、列表、分鍾、地圖和其他函數,但我想我實際上很笨。 我總是取回值而不是鍵,或者最終得到一個沒有幫助的過濾列表。
我也不喜歡創建兩個 dicts 的想法,例如“見過的”和“看不見的”食物,盡管這是一種真正的可能性。
最小可重現示例:(注釋/取消注釋從底部開始的第三行以獲取錯誤)
class Test:
def __init__(self,x,y):
self.x, self.y = x,y
x = {}
for i in range(3):
for j in range(3):
x[Test(i,j)] = (i+j)
# x[Test(9,9)] = None
m = min(x, key=x.get)
print(m.x,m.y)
一個簡單的方法:創建 (distance, item) 元組,不包括None
元組,並從中獲取最小值:
food = {'bread': 3, 'apple':2, 'pancake': None, 'ham':1}
reachable = [(distance, item) for item, distance in food.items() if distance is not None]
closest = min(reachable)[1]
print(closest)
# ham
將元組中的距離放在首位允許它們先按距離排序,而無需指定排序鍵。
好的,感謝所有評論,在社交媒體 python 組上找到了一個巧妙的解決方案!
剛剛在github上上傳了完整的項目! 如果有人想弄亂它,這是鏈接: https : //github.com/ParovSt/A-Bullet-Called-Life/blob/master/README.md
這是某人向我展示的解決方案:
min(x, key = lambda k: x[k] if x[k] != None else float('inf'))
這是我在此解決方案之前解決的問題:
for f in foods:
if distPerPoints((self.x,self.y),f.pos) < self.awareness:
self.vision[f] = distPerPoints((self.x,self.y),f.pos)
else:
#ignores completely each food out of range
if f in self.vision:
del self.vision[f]
#[...]
self.target = min(self.vision, key=self.vision.get)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.