python - 使用 python3 时 Lambda 函数错误

标签 python python-3.x

我有一段代码适用于 Python 2.7 但不适用于 Python3.7。在这里,我尝试按 lambda 函数的值排序。

def get_nearest_available_slot(self):
    """Method to find nearest availability slot in parking
    """
    available_slots = filter(lambda x: x.availability, self.slots.values())
    if not available_slots:
        return None
    return sorted(available_slots, key=lambda x: x.slotNum)[0]

我得到的错误是:

File "/home/xyz/Desktop/parking-lot/parking-lot-1.4.2/parking_lot/bin/source/parking.py", line 45, in get_nearest_available_slot
    return sorted(available_slots, key=lambda x: x.slotNum)[0]
IndexError: list index out of range

我在这里做错了什么?

最佳答案

答案很简单:这是因为 filter 的工作原理。

在 Python 2 中,filter急切求值,这意味着一旦您调用它,它就会返回一个列表:

filter(lambda x: x % 2 == 0, [1, 2, 3])

输出:

[2]

相反,在 Python 3 中,filter惰性求值;它生成一个可以迭代一次的对象,或者一个迭代器:

<filter at 0x110848f98>

在 Python 2 中,如果 filter 的结果为空,if not available_slots 行将停止执行,因为空的 list 计算为 错误

但是,在 Python 3 中,filter 返回一个迭代器,它的计算结果始终为 True,因为您无法判断迭代器是否已被没有尝试获取下一个元素就用尽了,迭代器没有长度。参见 this获取更多信息。

因此,存在一个空迭代器被传递给 sorted 的情况,产生另一个空的 list。您无法访问空 list 位置 0 处的元素,因此您会得到一个 IndexError

要解决此问题,我建议严格评估条件。您可以这样做,将 sorted 替换为 min,因为我们只需要一个值:

def get_nearest_available_slot(self):
    """Method to find nearest availability slot in parking
    """
    available_slots = [slot for slot in self.slots.values() if slot.availability]
    if available_slots:
        return min(available_slots, key=lambda x: x.slotNum)

    else:
        return None

关于python - 使用 python3 时 Lambda 函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56522596/

相关文章:

python - pygame.错误 : no video mode has been set

如果需要多个标准输入,python asyncio 会死锁

python - 如何测试一个类是否显式定义了 __gt__?

python - 如何在Python中正确显示图像?

python - Tkinter(Python 3.5): TypeError when calling `.configure` on a label object

python - 我将如何优化这种圆点碰撞检测方法?

python - 如何检查列表项是否在字典中。如果是,则打印与其关联的数据

python请求模块记录编码

database - 在python中使用pymysql连接数据库

python - 将整个单词下移索引