2

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

反而。

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

谢谢。

4

3 回答 3

8

不要修改您正在迭代的序列。pop在您处理它之前,每个人都在将一个字符向下移动。

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

于 2013-01-31T23:40:39.403 回答
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']
于 2013-01-31T23:46:03.997 回答
1

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

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

当您说 时for each_t in t,实际发生的是依次生成了一个数字序列;首先0,然后1等等,一直到len(t)-1. 然后迭代器获取该索引处的元素并将其分配给each_t.

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

这就是为什么在迭代列表时从列表中删除元素时跳过元素的原因

于 2013-01-31T23:46:40.470 回答