2012-12-06 51 views
1

我需要用數字替換一些字母到列表中(每個字母編碼爲一個數字)。我用這個結構:如何讓我的代碼更Pythonic?

r = [] 
for x in some_list: 
    if x in "ABCDE": 
     r.append({"A":10, "B":20, "C":30, "D":40, "E":50}[x]) 
    else: 
     r.append(int(x)) # convert string digit to digit 
some_list = r 

(some_list在這段代碼中是可變的)。

我想問一下在python(少代碼)中是否有一些更緊湊的結構可以使編碼更快,運行速度更快。

+0

你爲什麼不就地更換some_list的元素?這將爲您節省複製的頭條。 – RonaldBarzell

+0

這是什麼意思?我是v初學者python! – alinsoar

+0

這意味着不是建立一個單獨的列表r,然後將其分配給some_list,而是將some_list的每個元素設置爲循環中的新值。但是,還有一些其他的迴應,用一些非常緊湊的方式來做到這一點,所以我建議你先跟進。 – RonaldBarzell

回答

8

如何

d = {"A":10, "B":20, "C":30, "D":40, "E":50} 
some_list = [int(d.get(x, x)) for x in some_list] 

其他的方式來編寫列表理解包括:

some_list = [d.get(x) or int(x) for x in some_list] 
some_list = [d[x] if x in d else int(x) for x in some_list] 
+0

不好,some_list是(如上所見)由字母組成。如果d.get默認你會得到一個字母,它不能被轉換爲int。 –

+0

@InbarRose:'int()'來自OP問題中的'else'子句,並且服務的目的完全一樣。 – NPE

+0

我測試了它,它的工作原理:) – alinsoar

2

您可以將每個字符映射到數字

l=[(ord(x)-ord('A')+1)*10 if x in 'ABCDE' else int(x) for x in some_list] 

在更一般的情況下,你應用將字符翻譯爲字母的某些功能

def f(c): 
    if c in 'ABCDE': 
     return (ord(c)-ord('A')+1)*10 
    return int(c) 

l=[f(x) for x in some_list] 
+1

可以重寫爲list-comprehension:[ord(x) - ord('A')+ 1如果x在'ABCDE'中else x(int)在some_list ]' – Bakuriu