簡體   English   中英

如何將此循環轉換為列表推導?

[英]How do I convert this loop into a list comprehension?

我試圖用嵌套的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]

列表推導用於生成列表,而不是for循環正在執行的操作。 您可以根據需要執行以下操作:

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

sum用作布爾值的計數。

您不會在列表理解范圍內增加計數。 您只需列出符合條件的所有商品,然后檢查清單的長度即可:

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

i in ibi_a ,除非您有特定的原因要創建range和計數器變量( row ),否則最好i in ibi_a循環i in ibi_a ,甚至在原始的for循環中。 我會為i選擇一個更合適的變量名,但是我不知道“ ibi_a”代表什么或它的元素代表什么。

與丹尼爾(Daniel)達成協議后,有時會濫用列表理解能力以提高速度。 通常的漂亮vs更快,但當然要確定更快,您需要計時。 我對一個類似的循環進行了建模,並將它標記為listcomp和loop,並且在這種情況下獲得了幾乎相同的時序。 因此,我認為您最好將其作為循環。 仍然有趣的練習。

import random

l = [random.randrange(1, 100) for i in xrange(10000000)]
antStart = 30
def listcomp():
    rowCount = len([i for i in l if i < antStart])

def usingLoop():
    rowCount = 0
    for i in l:
        if i < antStart:
            rowCount = rowCount+1 

import timeit
print "list comp : ",timeit.timeit(listcomp, number=100)
print "loop : ",timeit.timeit(usingLoop, number=100)

結果是:

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

在這種特定情況下,您可以看到列表越大,列表分配的開銷就超過了通常對列表理解更快的循環速度的權重。

這不是列表理解的適當用法。 它們用於-顧名思義-生成列表; 您要做的是有條件地增加變量。 堅持使用for循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM