Python:为整数的每个数字加1
有更有效的方法吗?您在这里处理字符串,每个字符仍然是一个字符串,Python:为整数的每个数字加1,python,Python,有更有效的方法吗?您在这里处理字符串,每个字符仍然是一个字符串,type(x)永远不会是int。你想要的是 改为使用列表: samples = list('SX00182') def add(x): if type(x) == int: return x + 1 new_sample = map(add, samples) result = ''.join(new_sample) 这里的表达式str((int(x)+1)%10)将您的字符强制转换为整数,如果结果为
type(x)
永远不会是int
。你想要的是
改为使用列表:
samples = list('SX00182')
def add(x):
if type(x) == int:
return x + 1
new_sample = map(add, samples)
result = ''.join(new_sample)
这里的表达式str((int(x)+1)%10)
将您的字符强制转换为整数,如果结果为10,则向0添加1,“换行”,并再次将整个结果转换为字符串
您甚至不需要将示例
转换为列表,这也适用于字符串:
new_sample = [x if not x.isdigit() else str((int(x) + 1) % 10) for x in 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']
演示:
请注意,即使可以使用type(x)=int
测试,也不应该以这种方式使用type()。首先,类型最好用恒等式来测试(type(x)是int
),而不是相等式,你可以用isinstance(x,int)
来代替子类。你在这里处理字符串,每个字符仍然是字符串,type(x)
永远不会是int
。你想要的是
改为使用列表:
samples = list('SX00182')
def add(x):
if type(x) == int:
return x + 1
new_sample = map(add, samples)
result = ''.join(new_sample)
这里的表达式str((int(x)+1)%10)
将您的字符强制转换为整数,如果结果为10,则向0添加1,“换行”,并再次将整个结果转换为字符串
您甚至不需要将示例
转换为列表,这也适用于字符串:
new_sample = [x if not x.isdigit() else str((int(x) + 1) % 10) for x in 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']
演示:
请注意,即使可以使用type(x)=int
测试,也不应该以这种方式使用type()。首先,类型的测试最好使用标识(type(x)是int
),而不是相等,并且您应该使用isinstance(x,int)
来代替子类。通常在Python中,“更有效”意味着“做得更少”和“向下推它,以便任何循环都在较低级别上发生-在C中而不是在Python中循环”
由于您只有十个单字符映射(0:1、1:2等),因此绝对不需要检查它们是否为数字,将它们转换为整数,对它们进行数学计算,将答案模化以保持为一个数字,构建一个列表,将它们添加到列表中,然后将整个内容转换回字符串
取而代之的是,盲目地将它们替换为文本,然后,将其向下推到一个C库特性中,该特性为您提供了帮助。String.maketrans将左侧的文本字符映射到右侧的文本字符,然后String.translate使用翻译表替换文本字符
>>> 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'
一般来说,在Python中,“更高效”意味着“做得更少”和“将其向下推,以便任何循环都在较低的级别上发生——在C中循环而不是在Python中循环”
由于您只有十个单字符映射(0:1、1:2等),因此绝对不需要检查它们是否为数字,将它们转换为整数,对它们进行数学计算,将答案模化以保持为一个数字,构建一个列表,将它们添加到列表中,然后将整个内容转换回字符串
取而代之的是,盲目地将它们替换为文本,然后,将其向下推到一个C库特性中,该特性为您提供了帮助。String.maketrans将左侧的文本字符映射到右侧的文本字符,然后String.translate使用翻译表替换文本字符
>>> 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'
如果您有9
,该怎么办?哦,好问题,应该转到0 Ithink@Ffisegydd:好的,由于OP第一次将整个字符串转换为单个字符的列表,让我们假设SX11293
,作为map()
会将添加到该列表中的每个元素。如果有9
该怎么办?哦,好问题,应该转到0 Ithink@Ffisegydd:好的,由于OP第一次将整个字符串转换为单个字符的列表,让我们假设SX11293
,作为map()
会将添加应用到该列表中的每个元素。我有几乎相同的解决方案,但又太慢了。唯一的区别是我更喜欢lambda(increment=lambda x:str((int(x)+1)%10)
),这使得理解更具可读性:print'。join(increment(char)if char.isdigit()else char for char for samples)
我有几乎相同的解决方案,但又太慢了。唯一的区别是我更喜欢lambda(increment=lambda x:str((int(x)+1)%10)
),这使得理解更可读:print'。连接(increment(char)if char.isdigit()else char for char in samples)