2012-08-09 32 views

回答

4

這需要字符串的列表(存儲在變量list_of_strings),通過它遍歷暫時分配每個串給每個時間變量a和鋼帶從每個字符串中的字符\n。結果是列表被分配回相同變量的字符串。

這是使用的List Comprehension。一般來說,大多數for循環和list operations involving append()可以轉換爲等效的列表解析。這裏有一個簡單的例子證明這一點:

new_list = [] 
    for i in range(10): 
     new_list.append(i**2) 

可以簡單地作爲

new_list = [i**2 for i in range(10)] 

被改寫,您可能會發現它啓發把你的列表中理解和使用for -loop改寫它來測試您的理解(包括應該產生相同的結果)。

在大多數情況下,列表理解速度快於等效的for -loop,並且顯然是更緊湊的表示算法的方式。你也可以有嵌套的列表解析(就像你可以嵌套for -loops),但它們很快就很難理解:)

此外,雖然沒有在上面的代碼中顯示,但可以過濾列表中的值理解,即將他們(或不)列入結果列表,取決於他們是否符合某些標準。另外,Python還提供了類似的集合理解和生成器表達式。所有這些都值得學習。

+1

「你也可以嵌套列表解析(就像你可以嵌套for循環一樣),但是他們很快就很難理解」 - >「list(in)comprehensions」? :-) – 2012-08-09 23:15:23

+0

@JS。 ..是的,它可能有時似乎:) – Levon 2012-08-09 23:18:22

0

這是Python的一項名爲列表推導的功能。基本上,你在括號中寫的是'做這個循環,然後創建一個結果列表'的簡寫。

5

list comprehension

list_of_strings = [a.rstrip('\n') for a in list_of_strings] 

相當於這個更通用的代碼:

temp_list=[] 
for a in list_of_strings: 
    temp_list.append(a.rstrip('\n')) 

list_of_strings=temp_list 

在大多數情況下,一個列表理解是更快,更容易閱讀。學習它並使用它,如果你想編寫不重要的Python。

1

每個迭代結果都不會寫入列表,而是在右側創建一個全新的列表,然後將其分配給=符號左側的變量list_of_strings。

+0

這是沒有必要做拼接任務。理解的結果被反彈到'list_of_strings'後迭代原始列表並計算整個新列表。 – dawg 2012-08-09 01:20:44

+0

好的,謝謝,是否需要發電機? _我在很多年前被告知需要拼接,但我想不是那樣。如果列表和生成器的長度不同,會發生什麼? – 2012-08-09 01:22:38

+0

如果您進行切片分配,那麼使用生成器沒有真正的優勢,因爲您當時正在生成列表,不是嗎? – dawg 2012-08-09 01:26:58

0

列表綜合有以下一般形式

result = [ x for x in list] 

這個列表理解等效的程序代碼是:

for x in list: 
    x 


創建一個有用的列表內涵下一步是在括號後的第一個x調用或應用一個函數。

result = [function(x) for x in list] 
result = [x.function(arg) for x in list] 

list_of_strings = [a.rstrip('\n') for a in list_of_strings] 

result = [x*2 for x in list_of_numbers] 

這個列表理解等效的程序代碼是:

for x in list: 
    function(x) 

OR

for x in list: 
    x.function() 


要添加更多的權力,你的列表理解,你可以添加條件語句像這樣:

result = [function(x) for x in list if x == True] 

list_of_strings = [a.rstrip('\n') for a in list_of_strings if '\n' in a] 

result = [x*2 for x in [1,2,3,4,5,6,7] if x > 3] 

列表綜合做出這樣的功能極大的過濾器,並經常以最快的速度編碼就像地圖和過濾器在CPython的原語硬盤溫度。

相關問題