问题描述
是否可以将给定代码中带有 if 条件的 for 循环转换为列表推导式?
ListIndex = 0
timeSeries = []
Value = defaultValue
dfLength = len(dfCont.index)
for i in range(dfLength):
if abs(dfCont.iloc[i,0] - occurance[ListIndex]) < 0.0001:
Value = discreteValues[ListIndex]
ListIndex = ListIndex + 1
timeSeries.append(Value)
我尝试使用标准定义将此 for 循环压缩为列表理解,但它似乎不起作用。是否可以首先将这个 for 循环转换为列表理解?如果是,最好的方法是什么?
解决方法
我认为您不需要 ListIndex
变量,因为您可以从 enumerate
timeSeries = [discreteValues[idx] for idx,i in enumerate(dfLength) if abs(dfCont.iloc[i,0] - occurance[ListIndex]) < 0.0001]
,
使用 enumerate
获取索引和值。此外,您可以使用 else
[discreteValues[ListIndex] if abs(dfCont.iloc[i,0] - occurance[ListIndex]) < 0.0001 else defaultValue for ListIndex,i in enumerate(dfLength)]
,
不,我不相信您可以将其表达为列表推导式(至少,不会使理解/调试变得更糟)。
关键部分是您要在某些迭代中更新 Value
和 ListIndex
,并且需要这些更新后的值保留到未来的迭代中。这并不是列表推导式的真正工作方式,因为它们旨在替换 map()
函数。基本形式为:
[f(x) for x in y if g(x)]
您的输出是一个 f(x)
返回值列表,并且不能依赖于早期传入的 x
值,除非 f
保持全局状态(这很粗糙;不要不要那样做)。