将字符串插入整数列表

时间:2015-02-28 04:55:42

标签: python list type-conversion

我正在尝试创建一个脚本,其中' - '放在给定数字中的所有奇数位之间(即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:并非在字符串格式化期间转换所有参数

3 个答案:

答案 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