对于您询问的代码,@AnnZen (+1) 提供的建议是合理的,尽管我会折腾分号和额外的括号。我还会遍历字符串中的字符而不是它们的索引:
for c in A:
if c.isdigit():
A = A.replace(c, "#")
就解决完整问题(即添加非数字消除)而言,我们实际上不需要replace():
def convert(string):
result = ''
for character in string:
if character.isdigit():
result += "#"
return result
但是,如果我们想要使用replace(),这似乎也是一个使用defaultdict的机会:
from collections import defaultdict
dictionary = defaultdict(str, {digit: '#' for digit in "0123456789"})
def convert(string):
for character in string:
string = string.replace(character, dictionary[character])
return string
我们可以添加一些测试代码来检查一下:
if __name__ == "__main__": # test code
from random import choice, randint
from string import ascii_letters, digits
for tests in range(10):
test_string = ''.join(choice(ascii_letters + digits) for _ in range(randint(10, 20)))
print(repr(test_string), end=' -> ')
test_string = convert(test_string)
print(repr(test_string))
输出
> python3 test.py
'RzfMD5w3LQO' -> '##'
'NrFsFDDyOit593' -> '###'
'TpURdM0PqTQtaPe3IeP' -> '##'
'TN10mz39BukFNsgf' -> '###'
'ghYfxDLrPSEG5GCO' -> '#'
'9QAJ1PVyegMD' -> '#'
'GOIgOmzpC1ysn4' -> '#'
'LEdR2BafYi9paALgrN' -> '##'
'L2hzkSQNkH2Gb' -> '##'
'E6rnoGi2AamWW01R19' -> '####'
>
@duckboycool 的正则表达式想法有其优点,即使当前建议的实现没有。我们不需要两个模式匹配,只需要一个来消除非数字:
import re
def convert(string):
return '#' * len(re.sub(r'\D', '', string))
我的各种convert() 函数中的任何一个都应该适用于我上面的测试代码。