将带有 if 条件的 for 循环转换为列表推导式

问题描述

是否可以将给定代码中带有 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)]
,

不,我不相信您可以将其表达为列表推导式(至少,不会使理解/调试变得更糟)。

关键部分是您要在某些迭代中更新 ValueListIndex,并且需要这些更新后的值保留到未来的迭代中。这并不是列表推导式的真正工作方式,因为它们旨在替换 map() 函数。基本形式为:

[f(x) for x in y if g(x)]

您的输出是一个 f(x) 返回值列表,并且不能依赖于早期传入的 x 值,除非 f 保持全局状态(这很粗糙;不要不要那样做)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...