2012-12-06 50 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