Python:每个数字加一个整数

时间:2014-03-19 21:54:15

标签: python

samples = list('SX00182')

def add(x):
    if type(x) == int:
        return x + 1

new_sample = map(add, samples)

result = ''.join(new_sample)

有更有效的方法吗?

3 个答案:

答案 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'
相关问题