【发布时间】:2021-09-13 21:36:01
【问题描述】:
我正在编写一些代码,只要基于(或与)前一个元素相关的条件为真,就需要不断地从可迭代对象中获取元素。例如,假设我有一个数字列表:
lst = [0.1, 0.4, 0.2, 0.8, 0.7, 1.1, 2.2, 4.1, 4.9, 5.2, 4.3, 3.2]
让我们使用一个简单的条件:这个数字与之前的数字相差不超过 1。所以预期的输出是
[0.1, 0.4, 0.2, 0.8, 0.7, 1.1]
通常,itertools.takewhile 是一个不错的选择,但在这种情况下,它有点烦人,因为第一个元素没有要查询的前一个元素。以下代码返回一个空列表,因为对于第一个元素,代码会查询最后一个元素。
from itertools import takewhile
res1 = list(takewhile(lambda x: abs(lst[lst.index(x)-1] - x) <= 1., lst))
print(res1)
# []
我设法编写了一些“丑陋”的代码来解决:
res2 = []
for i, x in enumerate(lst):
res2.append(x)
# Make sure index is not out of range
if i < len(lst) - 1:
if not abs(lst[i+1] - x) <= 1.:
break
print(res2)
# [0.1, 0.4, 0.2, 0.8, 0.7, 1.1]
但是,我觉得应该有更多“pythonic”的方式来编码。有什么建议吗?
【问题讨论】:
标签: python python-3.x iterable