2012-01-12 17 views

回答

0

對我來說,例子有所不同。列表解析可能不會自然而然地發生,直到你用它們來解決一個或兩個for loop解決不了的問題。

的幾點思考(其他人可能有更好的例子):

  • 給出的單詞的列表中,找到長度爲5
  • 鑑於號碼列表的話,返回素數的子集,乘以2
  • 給定幸運餅乾語錄(或推文)的列表,返回一個長度不超過10個單詞的說明列表,並在每個結尾添加「在牀上」。
0

List內涵是相同的概念,思考一個for循環,除了他們是在同一行,你可以在線使用它們作爲參數。

myFunc([s.strip() for s in mystrings]) 

發電機組補充不會立即在內存中創建列表。他們步的值,當你遍歷他們,可以更有效率,如果你將提前停止遍歷他們不需要將整個結果馬上

2

這裏就是我想通過列表解析。

1)我需要輸出列表

2)我開始與列表/迭代。

3)我要麼需要上的所有元素執行操作和/或選擇從原來的名單的具體內容。

這使我下面的結構:

output = [ mangle(x) for x in selector(input)]

裂傷()是一些功能改變的元素。例如,我可能使用x.lower()來使元素小寫。

我總是使用x作爲迭代器。只是保持一致(並且我從不將它用作for循環中的迭代器)。

選擇器()是輸出TrueFalse的功能。通常這會是某種if語句。我主要使用這個存在的測試,特別是如果我是mangling輸出。例如,x for x in input if input

列表解析可能非常好。我認爲他們真的提高了可讀性,而且不僅僅是一個巧妙的技巧。但請記住,它們只不過是一個for循環內聯。

嘗試編寫循環並嘗試將它們轉換爲列表理解可能是最容易的。

+0

不錯,但關於'selector(input)'是函數的部分在我看來有點誤導。 – wim 2012-01-12 05:17:11

+0

> 3)我需要對所有元素執行操作和/或從原始列表中選擇特定元素。 'output = [mangle(x)for x in selector(input)]'< ->'output = [mangle(x)for x in selector(input)if check(x)]' – warvariuc 2012-01-12 06:11:28

1

如果你剛剛開始使用列表解析,這是我的頭腦。首先寫你的循環正常:

results = [] 

# get all keys that aren't test strings and add to results list 
for a in blah.keys(): 
    if a not in ('test', 'foo'): 
    results.append(a) 

我們創建一個列表理解,離開for循環,如果以相同的順序發言,並把它們放在同一行,把「最終結果」的代碼在開始:

results = [ results.append(a) for a in blah.keys() if a not in ('test', 'foo') ] 

我們快到了!我們並不需要手動添加(a)根據什麼我們把表達的那部分將自動被添加到列表中,因此最終表達式爲:

# get all keys that aren't test strings and add to results list 
results = [ a for a in blah.keys() if a not in ('test', 'foo') ] 

HTH!

+0

當我需要比較elemts兩個甚至更多的單獨列表。它變成了一種嵌套的理解。然後我被吹走了。需要花費很多時間來思考,測試閒置然後運行。有沒有優雅的思維方式,所以它只是走了。我相信會有,我認爲這使得它看起來很複雜...你的想法是什麼,使用理解的想法。 – Ashish 2012-01-12 06:43:32

+0

你有沒有例子? – fileoffset 2012-01-19 05:01:47