我的项目是基本的漫游AI。当食物在其感知范围之内时,它就会朝着它前进。如果食物不只一种,则应选择最近的食物。
我将食物存储在字典上作为键,并且分配给键的值是到所述食物的最后已知距离。 然后我检查字典是否有最短距离的食物,以便朝着它前进。
问题在于,在使用范围外的食物,以及使用时,都被赋予了值None(也尝试False)
await
它返回找到的第一个具有None / False值的键。通过在在线编译器上进行测试,我发现在较旧的python版本上存在此错误:
TypeError:不可排序的类型:NoneType()
我想现在它认为None类型总是小于数字(也经过ints检验)。
我正在尝试组合lambda,过滤器,列表,分钟,地图和其他功能,但我想我实际上是愚蠢的。我总是找回值而不是键,或者最终得到的过滤列表无济于事。
我也不喜欢创建两个指令的想法,例如“可见的”和“不可见的”食物,
最小的可复制示例: (从底部开始注释/取消注释第三行以获取错误)
min(self.vision, key=self.vision.get)
答案 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)