2014-07-20 96 views
3

我發現了這個代碼示例,我認爲這個示例編寫得很好,但我無法理解爲什麼它的一部分起作用。python中的兩個相鄰列表

代碼搜索字符串中的最長的一句話:

def LongestWord(str): 
    ''.join(map(lambda x: [' ',x][x.isalnum()], str)).split() 

我不知道如何[' ',x][x.isalnum()]作品。這個建築是否有名字?

+0

這是貫徹三元'拉姆達x的另一種方式:X,如果x。 isalnum()else''' – jonrsharpe

+0

注意:「代碼搜索字符串中最長的單詞」 - 嗯,我想這只是代碼的一部分,因爲你發佈的內容不會返回任何內容。 –

+0

@KarolyHorvath假定結果沒有被賦值,它不會真的做任何事情。 – jonrsharpe

回答

5

分解成兩個部分...

[' ', x] 

建立2個元素的列表。作爲重新寫:

lst = [' ', x] 
lst[x.isalnum()] 

現在我們看到第二個括號是指數第一括號創建列表。由於str.isalnum()返回一個布爾值(TrueFalse),並且由於布爾表現得像整數在python(True - >1False - >0),則結構剛剛選取在列表中的兩個元素中的一個。

注意,這些天(的python2.5及更高版本),它是更地道(也可能更有效)使用條件表達式:

lambda x: x if x.isalnum() else ' ' 
+1

或者完全避免使用lambda:'''.join(x如果x.isalnum()else''爲str中的x).split()'。或者更好的是're.split(「[^ A-Za-z] +」,str)' - 函數的實際意圖。 – Dunes

+0

@Dunes - 是的。肯定會更好,以避免'lambda' +'map'。我沒有考慮優化整個表達 - 只是對我正在解釋的那篇文章進行優化。 – mgilson

1

這是一種打破句子串分裂成一個單個單詞的列表,但將所有非字母數字字符替換爲被分隔符刪除的空格。爲了理解它,你必須從map命令開始。字符串(str)由lambda函數檢查,不管它是字母數字,如果是字母,字符保持不變('x'),但如果不是,它會被''(空格)替換。括號的工作方式像[false,true] [condition]。 map函數遍歷字符串(str)。然後,生成的列表(使用單個字符)以字符串形式(使用「.join」命令)加入完整句子中,並分割爲單詞(使用split()命令,以空格字符作爲分隔符)。

2

理解此代碼的關鍵是要知道布爾值可用於索引列表。

['a','b'][True] # produces 'b' 
['a','b'][False] # produces 'a' 

所以代碼

[' ',x][x.isalnum()] 

會產生x如果x是字母和數字,否則會產生'