【问题标题】:Python for loop isn't iterating '0' from a listPython for 循环没有从列表中迭代“0”
【发布时间】:2013-01-16 05:24:58
【问题描述】:

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

改为。

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

谢谢。

【问题讨论】:

    标签: python list for-loop iteration


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这是另一种方法(因为您的代码已经被其他人彻底讨论过):

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

      【讨论】:

      • 嗯,这让我对正则表达式可以做什么有了一个很好的了解,我会考虑使用它,但由于我是新手,我觉得它有点困难。谢谢!
      • re.findall('(\d+|\D+)',g) 可以很好地处理数字后跟非数字。我认为re.findall('(\d+)(\D+)',g) 会更有用,因为它为您提供了一个 (number, operator) 元组,但这不是 OP 想要的。
      • @sotapme -- 你是对的,但由于 OP 对正则表达式没有太多经验,我认为当前可能更冗长。
      • 如果我有类似 '10+10+20lol' 并且想要 'lol' 作为 ['l', 'o', 'l'] 怎么办,我尝试查看 docs.python.org/3.2/library/re.html 但是我找不到东西。
      • @fenrirsoul -- 像'(\d+|[a-zA-Z]|\+)'一样丢一个+
      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 感谢您的解释,我对python真的很陌生,我很感激。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 2012-06-27
      • 2023-03-05
      • 1970-01-01
      • 2012-11-28
      • 2015-12-24
      • 2016-03-03
      相关资源
      最近更新 更多