Python 在包含';无';/';假';价值观
我的项目是一个基本的漫游人工智能。当它的意识范围内有食物时,它就会朝它走去。如果它有一种以上的食物,它应该选择最近的 我将食物作为键存储在dict上,分配给键的值是到所述食物的最后已知距离。 然后,我检查字典,寻找距离最小的食物,以便朝它走去 问题是,超出范围的食物被赋予了值None(也尝试了False),并且在使用Python 在包含';无';/';假';价值观,python,sorting,dictionary,minimum,Python,Sorting,Dictionary,Minimum,我的项目是一个基本的漫游人工智能。当它的意识范围内有食物时,它就会朝它走去。如果它有一种以上的食物,它应该选择最近的 我将食物作为键存储在dict上,分配给键的值是到所述食物的最后已知距离。 然后,我检查字典,寻找距离最小的食物,以便朝它走去 问题是,超出范围的食物被赋予了值None(也尝试了False),并且在使用 min(self.vision, key=self.vision.get) 它返回找到的第一个键的值为None/False。通过在在线编译器上进行测试,我发现在较旧的python
min(self.vision, key=self.vision.get)
它返回找到的第一个键的值为None/False。通过在在线编译器上进行测试,我发现在较旧的python版本上存在以下错误:
TypeError:无序类型:NoneType()我想它不会认为没有一个类型总是比数字小(也用int测试)。< /P> 我试图将lambdas、过滤器、列表、分钟、地图和其他功能结合起来,但我想我实际上是个傻瓜。我总是返回值,而不是键,或者最终得到一个过滤列表,但没有任何帮助
我也不喜欢创建两个dict的想法,比如“看见的”和“看不见的”食物,尽管这是一个真正的可能性 最小可复制示例: (注释/取消注释底部第三行以获取错误)一种简单的方法是:创建(距离、项)元组,不包括
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上上传了完整的项目!如果有人想搞乱它,这里有一个链接: 以下是一些人向我展示的解决方案:
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)
食品中的氟:
如果distPerPoints((self.x,self.y),f.pos)
您能提供一个有效的解决方案吗?在浮动旁边的字典中似乎有None
值。您可能想先过滤掉它们。如果要分配值,为什么不使用float('inf')
?只添加了一个示例。float('inf')听起来正是我想要的!非常感谢!我提出了一个有点类似的解决方案,但没有创建一个新的列表:#查看所有食物并记录食物中f范围内的食物的距离:if distPerPoints((self.x,self.y),f.pos)
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)