2012-07-06 75 views
0

我想知道是否可以寫如下語句在一個行:「一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 ' ') 

我知道是不是更好或更漂亮,我只是想知道是否有可能。

+1

優雅的解決方案或表達式也被稱爲「地道」(聲音比「單一化」更好) – 2012-07-06 18:29:01

+1

@Otto:但他並沒有要求最優雅。他特別要求提供一攬子計劃,即使明確表示它可能不會「更好或更漂亮」。這顯示了非常不錯的直覺,因爲*慣用語* Python *應該儘可能可讀。在這種情況下,我確實認爲他所要做的一切都是對於有經驗的Python程序員來說是非常易讀的,所以它既是一行代碼又是一個慣用的代碼。 – 2012-07-06 18:42:46

回答

2

你在錯誤的地方使用內聯條件(如果你沒有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) 
2

你幾乎擁有了:

''.join(c if c not in blacklist else ' ' for c in text) 

X if Y else Z本身就是一個表達式,所以你不能通過將for c in text部分放在中間來分割它。

+0

在JAB的答案和這個答案之間很難做出選擇,因爲它們幾乎完全相同(或者在JAB編輯之前)。我喜歡這個更好,因爲它包含了if..else三元表達式的一些解釋。對於這個鼓勵性音色(「幾乎是這樣」),也是一點點加分。並非JAB的答案在任何方面都不好。 – 2012-07-06 20:57:40

3

迭代它似乎是一個過度複雜的方式來做到這一點。爲什麼不使用regex

import re 
blacklist = re.compile(r'[xyz]') # Blacklist the characters 'x', 'y', 'z' 
new = re.sub(blacklist, ' ', text) 
+0

我用正則表達式知道它更容易,這只是一個沒有正則表達式的具體例子 – olanod 2012-07-06 18:42:59

0

使用str的translate方法。到位黑名單的人的建設的白名單中字符的字符串,以「」:

>>> table = ''.join(c if c not in 'axy' else ' ' for c in map(chr,range(256))) 

然後調用與此表翻譯:

>>> 'xyzzy'.translate(table) 
' zz ' 
+0

這似乎只是有點矯枉過正。 – JAB 2012-07-06 18:47:26