簡體   English   中英

在包含“無”/“假”值的字典上獲取具有最小值的鍵

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM