python - 使用 python3 时出现 Lambda 函数错误
问题描述
我有一段代码适用于 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
被热切地评估,这意味着一旦你调用它,它就会返回一个list
:
filter(lambda x: x % 2 == 0, [1, 2, 3])
输出:
[2]
相反,在 Python 3 中,filter
是惰性求值的;它产生一个可以迭代一次的对象,或者一个迭代器:
<filter at 0x110848f98>
在 Python 2 中,如果 的结果为空,则该行if not available_slots
停止执行filter
,因为空的list
计算结果为False
。
但是,在 Python 3 中,filter
返回一个迭代器,它的计算结果始终为True
,因为如果不尝试获取下一个元素,就无法判断迭代器是否已用尽,并且迭代器没有长度。有关更多信息,请参阅此。
因此,存在将空迭代器传递给 的情况sorted
,从而产生另一个空迭代器list
。您无法访问位于0
空位置的元素list
,因此您会得到一个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
推荐阅读
- scala - 在 Play Web 框架中读取完整的请求 URL
- c# - 如何从类库 NuGet 包中排除包?
- javascript - 通用windows应用webview获取谷歌地图事件
- python - 检索 DataFrame 的整行
- python - 在 C++ 中解析基于位的消息
- javascript - Vue 渲染按钮
- javascript - 将鼠标悬停在页面底部时,Qtip 会在页面底部显示文本
- c++ - 防止 qDebug() 写入标准输出
- symfony - Symfony Doctrine 获取最近的对象结果:Having 子句
- android - 我们可以通过应用程序本身获取应用程序用户的评分(评论)吗?