Python for循环不是从列表中迭代'0'

时间:2013-01-31 23:36:54

标签: python list for-loop iteration

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']

代替。

代码是否存在任何问题或是否有更好的解决方案使其按预期工作?

感谢。

3 个答案:

答案 0 :(得分:8)

不要修改您正在迭代的序列。每个pop都会在您处理之前移动一个字符。

在这种情况下,由于您在完成后未使用t,因此根本不需要pop - 这是多余的。

答案 1 :(得分: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']

答案 2 :(得分:1)

在迭代它时编辑列表(或任何其他可迭代的)是一个可怕的想法。

以下是迭代列表的工作原理:

当你说for each_t in t时,实际发生的是依次产生一系列数字;先是0,然后是1,依此类推,一直到len(t)-1。然后,迭代器获取该索引处的元素并将其分配给each_t

当您从该列表中弹出时,您将删除索引。因此,过去在索引3处的内容现在位于索引2处(如果您在索引小于3时弹出某些内容)。然后会发生的是迭代器访问下一个数字的元素。但由于元素基本上向下移动了一个索引,当迭代器要求索引i处的元素时,它意味着“给我以前在索引i处的元素”。相反,它得到的是“当前在索引i的元素,它确实是以前在索引i+1处的元素”。

这正是您在迭代时从列表中删除时跳过元素的原因