我想知道是否可以寫如下語句在一個行:「一lineize」蟒蛇聲明
new = ''
for char in text:
if char in blacklist:
new += ' '
else:
new += char
我試過,但我得到的語法錯誤:
new = ''.join(c for c in text if c not in blacklist else ' ')
我知道是不是更好或更漂亮,我只是想知道是否有可能。
我想知道是否可以寫如下語句在一個行:「一lineize」蟒蛇聲明
new = ''
for char in text:
if char in blacklist:
new += ' '
else:
new += char
我試過,但我得到的語法錯誤:
new = ''.join(c for c in text if c not in blacklist else ' ')
我知道是不是更好或更漂亮,我只是想知道是否有可能。
你在錯誤的地方使用內聯條件(如果你沒有else ' '
那麼它會工作,因爲它只是一個迭代器上的過濾器)。正因爲如此,你會想要做這種方式:
new = ''.join(c if c not in blacklist else ' ' for c in text)
你也可以像這樣做,如果你想:
new = ''.join(' ' if c in blacklist else c for c in text)
你幾乎擁有了:
''.join(c if c not in blacklist else ' ' for c in text)
X if Y else Z
本身就是一個表達式,所以你不能通過將for c in text
部分放在中間來分割它。
在JAB的答案和這個答案之間很難做出選擇,因爲它們幾乎完全相同(或者在JAB編輯之前)。我喜歡這個更好,因爲它包含了if..else三元表達式的一些解釋。對於這個鼓勵性音色(「幾乎是這樣」),也是一點點加分。並非JAB的答案在任何方面都不好。 – 2012-07-06 20:57:40
使用str的translate方法。到位黑名單的人的建設的白名單中字符的字符串,以「」:
>>> table = ''.join(c if c not in 'axy' else ' ' for c in map(chr,range(256)))
然後調用與此表翻譯:
>>> 'xyzzy'.translate(table)
' zz '
這似乎只是有點矯枉過正。 – JAB 2012-07-06 18:47:26
優雅的解決方案或表達式也被稱爲「地道」(聲音比「單一化」更好) – 2012-07-06 18:29:01
@Otto:但他並沒有要求最優雅。他特別要求提供一攬子計劃,即使明確表示它可能不會「更好或更漂亮」。這顯示了非常不錯的直覺,因爲*慣用語* Python *應該儘可能可讀。在這種情況下,我確實認爲他所要做的一切都是對於有經驗的Python程序員來說是非常易讀的,所以它既是一行代碼又是一個慣用的代碼。 – 2012-07-06 18:42:46