如何将此循环转换为列表解析?

时间:2016-01-19 16:27:26

标签: python list-comprehension nested-loops

我试图将这个循环用嵌套的if语句转换为python中的列表理解。我认为我在列表推导中看到模式时遇到了麻烦。对于上下文,下面的循环扫描一个名为ibi_a的数组,如果它扫描的每个索引的值都小于变量antStart,则会增加rowCount。

rowCount = 0
for row in range(0,len(ibi_a)):
    if ((float(ibi_a[row][timeStampCol])) < antStart):
        rowCount = rowCount+1 #increase rowCount to search for index of antStart

我试过以下代码但没有运气。

rowCount = 0
rowCount = [rowCount+1 for row in range(0,len(ibi_a)) if ((float(ibi_a[row][timeStampCol])) < antStart]

4 个答案:

答案 0 :(得分:3)

列表推导用于生成列表,这不是您的for循环正在执行的操作。你可以这样做:

rowCount = sum((float(row[timeStampCol]) < antStart) for row in ibi_a)

sum充当布尔值的计数。

答案 1 :(得分:1)

你不会在列表理解中增加一个计数;您只需列出符合条件的所有项目,并查看列表的长度:

rowCount = len([i for i in ibi_a if float(i[timeStampCol]) < antStart])

顺便说一句,除非您有一些特定的理由来创建range和计数器变量(row),否则循环i in ibi_a会更好。甚至在你原来的for循环中。我会为i选择一个更合适的变量名,但我不知道&#34; ibi_a&#34;代表或其元素代表什么。

答案 2 :(得分:1)

与丹尼尔达成一致,有时为了达到更好的速度,可以滥用列表理解。平常漂亮vs更快,但当然可以肯定你需要更快的时间。 我建模了一个类似的循环,并将它标记为listcomp和loop,在这种情况下获得了相同的时序。所以我认为你最好把它作为一个循环。 仍然有趣的运动。

Item count : 10^6
list comp :  3.24901601876 s
loop :  3.13708115184 s

Item count : 10^7
list comp :  35.7664684531 s
loop :  31.1584190731 s

结果是:

cvtColor

在这种特定情况下,您可以看到,随着列表越大,列表分配中的开销超过了列表理解的通常更快的循环速度。

答案 3 :(得分:0)

这不适合使用列表推导。它们是 - 顾名思义 - 生成列表;你想要做的是有条件地增加一个变量。坚持你的for循环。