我试图将这个循环用嵌套的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]
答案 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循环。