在包含“无” /“假”值的字典中获取具有最小值的键

时间:2019-12-03 20:19:21

标签: python sorting dictionary minimum

我的项目是基本的漫游AI。当食物在其感知范围之内时,它就会朝着它前进。如果食物不只一种,则应选择最近的食物。

我将食物存储在字典上作为键,并且分配给键的值是到所述食物的最后已知距离。 然后我检查字典是否有最短距离的食物,以便朝着它前进。

问题在于,在使用范围外的食物,以及使用时,都被赋予了值None(也尝试False)

await

它返回找到的第一个具有None / False值的键。通过在在线编译器上进行测试,我发现在较旧的python版本上存在此错误:

  

TypeError:不可排序的类型:NoneType()

我想现在它认为None类型总是小于数字(也经过ints检验)。

我正在尝试组合lambda,过滤器,列表,分钟,地图和其他功能,但我想我实际上是愚蠢的。我总是找回值而不是键,或者最终得到的过滤列表无济于事。

我也不喜欢创建两个指令的想法,例如“可见的”和“不可见的”食物,

最小的可复制示例: (从底部开始注释/取消注释第三行以获取错误)

min(self.vision, key=self.vision.get)

2 个答案:

答案 0 :(得分:0)

一种简单的方法:创建(距离,项)的元组,排除带有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

首先在元组中放置距离,这样就可以先按距离对它们进行排序,而不必指定排序键。

答案 1 :(得分:0)

好的,谢谢您的所有评论,发现了社交媒体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)
相关问题