Цикл Python for не повторяет '0' из списка!

Я попытался сделать код для разделения ввода на цифры и буквы (или операторы):

g='10+10+20x'

t=[]
for each_g in g:
    t.append(each_g)

lol=[]
a=[]
for each_t in t:
    if each_t.isdigit():
        lol.append(each_t)
        x = t.index(each_t)
        t.pop(x)
    else:
        lol = ''.join(lol)
        a.append(lol)
        a.append(each_t)
        lol=[]
print(a)

Желаемый результат будет:

['10', '+', '10', '+', '20', 'x']

Но он печатает

['1', '+', '1', '+', '2', 'x']

Вместо.

Есть ли проблемы с кодом или лучшее решение, чтобы оно работало как положено?

Спасибо.

2
R3D57R34K 1 Фев 2013 в 03:36

3 ответа

Лучший ответ

Вот альтернативный подход (так как ваш код уже был тщательно обсужден другими):

In [38]: import re

In [39]: g='10+10+20x'

In [40]: re.findall('(\d+|[a-zA-Z]+|\+)',g)
Out[40]: ['10', '+', '10', '+', '20', 'x']
3
root 31 Янв 2013 в 23:46

Не изменяйте последовательность, которую вы повторяете. Каждый pop сдвигает символ вниз, прежде чем вы сможете его обработать.

В этом случае, поскольку вы не используете t, когда вы закончите, для pop вообще нет необходимости - это избыточно.

8
Mark Ransom 31 Янв 2013 в 23:40

Редактирование списка (или любого другого итерируемого) во время итерации по нему - ужасная идея.

Вот как работает перебор списка:

Когда вы говорите for each_t in t, на самом деле происходит то, что последовательность чисел генерируется по очереди; сначала 0, затем 1 и так далее, вплоть до len(t)-1. Затем итератор получает элемент по этому индексу и назначает его each_t.

Когда вы попадаете из этого списка, вы удаляете индекс. Следовательно, то, что раньше было в индексе 3, теперь находится в индексе 2 (если вы добавили что-то с индексом меньше 3). Затем происходит то, что итератор обращается к элементу по следующему номеру. Но поскольку элементы существенно сместились вниз по индексу, когда итератор запрашивает элемент по индексу i, это означает «дать мне элемент, который раньше был по индексу i». Вместо этого он получает «элемент с индексом i, который действительно является элементом с индексом i+1».

Именно поэтому вы пропускаете элементы при удалении из списка во время его итерации.

1
inspectorG4dget 31 Янв 2013 в 23:46