2015-02-28 6 views
0

Я пытаюсь создать скрипт, в котором между всеми нечетными цифрами в заданном номере помещается '-' (то есть 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

Traceback (последний звонок последний):

Файл "DashInsert.py", li пе 17, в

print DashInsert(string) 

Файл "DashInsert.py", строка 11, в DashInsert

if (list_int[i] % 2 == 1) and (list_int[i+1] % 2 == 1): 

TypeError: не все аргументы преобразуются во строки форматирования

+0

Пожалуйста, покажите фактический ввод и фактическую ошибку. – thefourtheye

+0

FYI это происходит потому, что вы изменяете (в частности, добавляете) список **, пока вы повторяете его **. Это почти никогда не бывает хорошей идеей. Я имею в виду, посмотри, что ты делаешь. Сначала вы включаете все в ints, но тогда вы найдете тот, который хотите, и вставляете ** строку ** в следующую позицию. Следовательно, в следующем раунде ваш '%' является строковым форматированием! –

+0

@ Two-BitAlchemist Я понимаю, что вы говорите, но оператор if не должен позволять вставленному «-» через право? Поэтому я не понимаю, почему его не работает –

ответ

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 
+0

Это было здорово, это было именно то, что мне было нужно, и я понимаю, почему вы использовали i в качестве индекса для списка и e как переменную списка. Один быстрый вопрос, хотя в вашем цикле for почему python использует i как индекс и e как переменную? Казалось бы, и i, и e будут переменными перечисляемого списка, извините, если это глупый вопрос. –

+0

Не глупый вопрос вообще! Возврат из [enumerate] (https://docs.python.org/2/library/functions.html#enumerate) представляет собой кортеж, содержащий индекс в последовательности и элемент в этой последовательности с этим номером индекса (если последовательность поддерживает индексирование, что не все делают). Когда у меня есть 'для i, e в перечислении (seq)' он распаковывается в i и e, что два члена кортежа. Очистить? –

1

Вы могли бы сделать это с помощью регулярных выражений.

>>> import re 
>>> s = 991453 
>>> re.sub(r'(?<=[13579])(?=[13579])', r'-', str(s)) 
'9-9-145-3' 
+0

Не могли бы вы объяснить r '(? <= [13579]) (? = [13579])' часть вашего кода? Также мне не разрешено импортировать модули для решения этой проблемы. –

+0

Поскольку это домашнее задание и, очевидно, для низкоуровневого CS-класса, не беспокойтесь об этой части его кода. Это называется [регулярным выражением] (https://docs.python.org/2/howto/regex.html), и вы получите их позже в своих классах CS более высокого уровня, которые пересекаются в математике за ней. В основном они позволяют вам описывать строку шаблонами, даже если вы не знаете, что именно скажет. Если вам придется делать это без импорта, ваш код будет работать, но не изменяйте список на месте во время итерации. Вместо этого запишите, где дефис должен идти и вставлять их позже. –

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)) 

Edit: На самом деле, нет никакой необходимости, чтобы сделать список, так что мы можем сделать this-

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) 

Edit: Вот как это сделать без 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) 
Смежные вопросы