samples = list('SX00182')
def add(x):
if type(x) == int:
return x + 1
new_sample = map(add, samples)
result = ''.join(new_sample)
有更有效的方法吗?
答案 0 :(得分:3)
您在这里处理字符串,每个字符仍然是一个字符串,而type(x)
永远不会是int
。你想要str.isdigit()
。
改为使用列表理解:
new_sample = [x if not x.isdigit() else str((int(x) + 1) % 10) for x in samples]
此处表达式str((int(x) + 1) % 10)
将您的角色转换为整数,添加1,'包裹圆形'如果结果为10,则为0
,并将整个结果再次转换为字符串。
您甚至不需要将samples
转换为列表,这也适用于字符串:
>>> samples = 'SX00182'
>>> [x if not x.isdigit() else str((int(x) + 1) % 10) for x in samples]
['S', 'X', '1', '1', '2', '9', '3']
完整代码:
def increment_digits(string):
return ''.join([x if not x.isdigit() else str((int(x) + 1) % 10) for x in string])
演示:
>>> def increment_digits(string):
... return ''.join([x if not x.isdigit() else str((int(x) + 1) % 10) for x in string])
...
>>> increment_digits('SX00182')
'SX11293'
>>> increment_digits('SX11293')
'SX22304'
请注意,即使您可以使用type(x) == int
测试,也不应该以这种方式使用type()
。首先,类型最好使用标识(type(x) is int
)进行测试,而不是相等,并且您也可以使用isinstance(x, int)
来允许子类。
答案 1 :(得分:1)
通常在Python中,"效率更高"意味着"少做"并且"将其向下推,以便任何循环都发生在较低级别 - 循环使用C而不是Python"。
由于你只有10个单字符映射(0:1,1:2等),所以绝对不需要检查它们是否是数字,将它们转换为整数,数学计算在他们身上,模块化答案以保持单个数字,构建列表,将它们添加到列表中,然后将整个事物转换回字符串。
相反,将它们作为文本盲目地替换,然后将其推送到C库功能,它可以为您完成工作。 String.maketrans将左侧的 text 字符映射到右侧的字符,然后string.translate使用转换表替换文本字符。
import string
samples = "SX00182"
translation = string.maketrans('0123456789', '1234567890')
print string.translate(samples, translation)
答案 2 :(得分:0)
next_digit = {str(i):str((i+1)%10) for i in range(10)}
def incr(s):
return ''.join(next_digit.get(ch, ch) for ch in s)
incr("SX001829") # => 'SX112930'