我有一段代码适用于 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/