我正在尝试创建一个脚本,其中' - '放在给定数字中的所有奇数位之间(即991453将是9-9-145-3),但由于某种原因python不允许我插入一个整数列表的str。我一直得到的错误是'TypeError:并非在字符串格式化期间转换所有参数'
我的代码:
def DashInsert(text):
list_int = map(int, list(text))
for i in xrange(len(list_int)-1):
if (list_int[i] % 2 == 1) and (list_int[i+1] % 2 == 1):
print i
list_int.insert(i+1,'-')
return list_int
这是我的实际输入和错误:
999472
0
追踪(最近一次呼叫最后一次):
文件“DashInsert.py”,第17行,在
中print DashInsert(string)
文件“DashInsert.py”,第11行,在DashInsert中
if (list_int[i] % 2 == 1) and (list_int[i+1] % 2 == 1):
TypeError:并非在字符串格式化期间转换所有参数
答案 0 :(得分:1)
您可以通过正则表达式执行此操作。
>>> import re
>>> s = 991453
>>> re.sub(r'(?<=[13579])(?=[13579])', r'-', str(s))
'9-9-145-3'
答案 1 :(得分:1)
我怀疑这是可怕的代码,但它确实有效 -
number = 991453
number_list = []
for i, item in enumerate(str(number)):
try:
if int(item) % 2 != 0 and int(str(number)[i + 1]) % 2 != 0:
number_list.append(item + '-')
else:
number_list.append(item)
except:
number_list.append(item)
print(''.join(number_list))
编辑:实际上,没有必要制作一个列表,所以我们可以这样做 -
number = 991453
dash_number = ''
for i, item in enumerate(str(number)):
try:
if int(item) % 2 != 0 and int(str(number)[i + 1]) % 2 != 0:
dash_number += item + '-'
else:
dash_number += item
except:
dash_number += item
print(dash_number)
编辑:以下是没有try / except的方法。
number = 991453
dash_number = ''
for i, item in enumerate(str(number)[:-1]):
if int(item) % 2 != 0 and int(str(number)[i + 1]) % 2 != 0:
dash_number += item + '-'
else:
dash_number += item
dash_number += str(number)[-1]
print(dash_number)
答案 2 :(得分:1)
您的错误是因为您正在修改正在迭代的列表。当您将-
插入列表时,它将成为%
的目标,并且您会收到TypeError。
在Python中,%
是字符串格式的运算符,'-'
是字符串;这就是为什么你得到一个不太清楚的错误:
>>> '-' % 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
对于字符串,您可以这样使用%
:
>>> 'x %s y %s %i' % ('and', 'is', 13)
'x and y is 13'
您的代码的修复是附加到单独的列表:
def DashInsert(s):
list_int = map(int, s)
rtr=[]
for i, e in enumerate(list_int[0:-1]):
rtr.append(str(e))
if e % 2 == 1 and list_int[i+1] % 2 == 1:
rtr.append('-')
rtr.append(str(list_int[-1]))
return rtr