2015-04-01 32 views
2

我想用python编写一个代码,它将用“a”替换每个小写字母,每个大写字母用“A”替代,每个数字替换为0.我编写代码但它造成的x上的错误不在列表中,代码如下如何替换python中的列表中的字符

tokens = ["apple","banana","Orange", "pineApple", "10nuts"] 
for token in tokens: 
    for ch in token: 
     if ch.islower(): 
      loc = tokens.index(ch) 
      tokens.remove(ch) 
      tokens.insert(loc,'a'); 
     elif ch.isupper(): 
      loc = tokens.index(ch) 
      tokens.remove(ch) 
      tokens.insert(loc,'A'); 
     elif ch.isdigit(): 
      loc = tokens.index(ch) 
      tokens.remove(ch) 
      tokens.insert(loc,'0'); 
for t in tokens: 
    print t 
+1

这可能是[regex]的一个很好的用法(https://docs.python.org/2/library/re.html) – pzp 2015-04-01 03:00:38

+0

你可以帮我在那个reepect – 2015-04-01 03:05:03

+0

我刚回答说明如何去做。 – pzp 2015-04-01 03:16:08

回答

1

您应该使用正则表达式来执行此任务:

import re 

tokens = ["apple","banana","Orange", "pineApple", "10nuts"] 

upper = re.compile(r"[A-Z]") 
lower = re.compile(r"[a-z]") 
number = re.compile(r"[0-9]") 

for token in tokens: 
    token = re.sub(upper,'A',token) 
    token = re.sub(lower,'a',token) 
    token = re.sub(number,'0',token) 
    print token 

的变量上,下和数量是预编译的规则表达式,因为你正在使用它们一个循环,这是更快。

您也可以在循环缩短到一个三行:

for token in tokens: 
    token = re.sub(upper,'A',re.sub(lower,'a',re.sub(number,'0',token))) 
    print token 

希望这有助于

编辑:拿了我的代码从上面,用一行代码,但所用的枚举环路通过pzp1997建议:

import re 

tokens = ["apple","banana","Orange", "pineApple", "10nuts"] 

upper = re.compile(r"[A-Z]") 
lower = re.compile(r"[a-z]") 
number = re.compile(r"[0-9]") 

for i, token in enumerate(tokens): 
    tokens[i] = re.sub(upper,'A',re.sub(lower,'a',re.sub(number,'0',token))) 

print tokens 
+0

thx,它帮了我 – 2015-04-01 03:26:00

+0

实际上根据timeit,在这种情况下不编译正则表达式会更快: '''%timeit [re.sub(upper,'A',re.sub(lower,' a',re.sub(number,'0',token)))]''' '''10000循环,最好是3:每循环64.2μs' '''%timeit [re.sub(r'[AZ]','A',re.sub(r'[az]','a',re.sub(r'\ d','0',token)))for令牌在令牌]''' '''10000循环,最好的3:每循环39.4μs''' 而这还不包括编译它们所需的额外时间... – pzp 2015-04-01 03:26:19

+0

@ pzp1997编译可能对于有5个条目的数组而言,速度并不快,但如果我们面对更大的令牌集合,我会强烈地假设, ed版本运行得更快。 – 2015-04-01 03:43:59

2

使用regular expressions

from re import sub 

tokens = ["apple","banana","Orange", "pineApple", "10nuts"] 

for i, token in enumerate(tokens): 
    token = sub(r'[A-Z]', 'A', token) 
    token = sub(r'[a-z]', 'a', token) 
    token = sub(r'\d', '0', token) 
    tokens[i] = token 

print tokens 
## Output: ['aaaaa', 'aaaaaa', 'Aaaaaa', 'aaaaAaaaa', '00aaaa'] 
+0

对于一个小集合,你的代码更加紧凑(甚至可以让这个令牌替换为一个班轮),我喜欢你的枚举,这是索引写回的更好选择 – 2015-04-01 03:46:30

相关问题