我發現了這個代碼示例,我認爲這個示例編寫得很好,但我無法理解爲什麼它的一部分起作用。python中的兩個相鄰列表
代碼搜索字符串中的最長的一句話:
def LongestWord(str):
''.join(map(lambda x: [' ',x][x.isalnum()], str)).split()
我不知道如何[' ',x][x.isalnum()]
作品。這個建築是否有名字?
我發現了這個代碼示例,我認爲這個示例編寫得很好,但我無法理解爲什麼它的一部分起作用。python中的兩個相鄰列表
代碼搜索字符串中的最長的一句話:
def LongestWord(str):
''.join(map(lambda x: [' ',x][x.isalnum()], str)).split()
我不知道如何[' ',x][x.isalnum()]
作品。這個建築是否有名字?
分解成兩個部分...
[' ', x]
建立2個元素的列表。作爲重新寫:
lst = [' ', x]
lst[x.isalnum()]
現在我們看到第二個括號是指數第一括號創建列表。由於str.isalnum()
返回一個布爾值(True
或False
),並且由於布爾表現得像整數在python(True
- >1
,False
- >0
),則結構剛剛選取在列表中的兩個元素中的一個。
注意,這些天(的python2.5及更高版本),它是更地道(也可能更有效)使用條件表達式:
lambda x: x if x.isalnum() else ' '
這是一種打破句子串分裂成一個單個單詞的列表,但將所有非字母數字字符替換爲被分隔符刪除的空格。爲了理解它,你必須從map命令開始。字符串(str)由lambda函數檢查,不管它是字母數字,如果是字母,字符保持不變('x'),但如果不是,它會被''(空格)替換。括號的工作方式像[false,true] [condition]。 map函數遍歷字符串(str)。然後,生成的列表(使用單個字符)以字符串形式(使用「.join」命令)加入完整句子中,並分割爲單詞(使用split()命令,以空格字符作爲分隔符)。
理解此代碼的關鍵是要知道布爾值可用於索引列表。
['a','b'][True] # produces 'b'
['a','b'][False] # produces 'a'
所以代碼
[' ',x][x.isalnum()]
會產生x如果x是字母和數字,否則會產生'
這是貫徹三元'拉姆達x的另一種方式:X,如果x。 isalnum()else''' – jonrsharpe
注意:「代碼搜索字符串中最長的單詞」 - 嗯,我想這只是代碼的一部分,因爲你發佈的內容不會返回任何內容。 –
@KarolyHorvath假定結果沒有被賦值,它不會真的做任何事情。 – jonrsharpe