Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在包含';无';/';假';价值观_Python_Sorting_Dictionary_Minimum - Fatal编程技术网

Python 在包含';无';/';假';价值观

Python 在包含';无';/';假';价值观,python,sorting,dictionary,minimum,Python,Sorting,Dictionary,Minimum,我的项目是一个基本的漫游人工智能。当它的意识范围内有食物时,它就会朝它走去。如果它有一种以上的食物,它应该选择最近的 我将食物作为键存储在dict上,分配给键的值是到所述食物的最后已知距离。 然后,我检查字典,寻找距离最小的食物,以便朝它走去 问题是,超出范围的食物被赋予了值None(也尝试了False),并且在使用 min(self.vision, key=self.vision.get) 它返回找到的第一个键的值为None/False。通过在在线编译器上进行测试,我发现在较旧的python

我的项目是一个基本的漫游人工智能。当它的意识范围内有食物时,它就会朝它走去。如果它有一种以上的食物,它应该选择最近的

我将食物作为键存储在dict上,分配给键的值是到所述食物的最后已知距离。 然后,我检查字典,寻找距离最小的食物,以便朝它走去

问题是,超出范围的食物被赋予了值None(也尝试了False),并且在使用

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)