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']
代替。
代码是否存在任何问题或是否有更好的解决方案使其按预期工作?
感谢。
答案 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
处的元素”。
这正是您在迭代时从列表中删除时跳过元素的原因