【问题标题】:Unexpected output of for.. in loop in PythonPython中for.. in循环的意外输出
【发布时间】:2017-06-12 05:50:10
【问题描述】:

我想运行一个 for 循环来检查字符串中的每个字母,如果 wanted 列表包含该字母,那么我希望该字母保留,如果 wanted 不包含该字母,那么我想删除它。

phrase = "Don't panic"
pList = list(phrase)
print(pList)
wanted = ["o","n","t","a","p"]
for anything in pList:
    print("Now checking", anything)
    if anything not in wanted:
        print("Removed",anything) 
        pList.remove(anything)
    elif anything in wanted:
        print("Didn't remove", anything)

print(pList)

以下代码返回此输出-

['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c']                                                   

Now checking D                                                                                       
Removed D                                                                                                                                                                                           
Now checking n                                                                                          
Didn't remove n                                                                                         
Now checking '                                                                                           
Removed '                                                                                                                                                                                               
Now checking                                                                                              
Removed                                                                                                                                                                                                 
Now checking a                                                                                           
Didn't remove a                                                                                         
Now checking n                                                                                           
Didn't remove n                                                                                           
Now checking i                                                                                          
Removed i                                                                                                                                                                                       
['o', 'n', 't', 'p', 'a', 'n', 'c']   

代码没有删除最后一个字母(即“c”),字母“o”、“t”、“p”和“c”没有显示Now checking输出。

我尝试删除一些行然后就跑了 -

phrase = "Don't panic"
pList = list(phrase)
print(pList)
wanted = ["o","n","t","a","p"]
for anything in pList:
    print("Now checking", anything)

这一次的输出有意义 -

Now checking D                                                                                            
Now checking o                                                                                            
Now checking n                                                                                            
Now checking '                                                                                            
Now checking t                                                                                            
Now checking                                                                                              
Now checking p                                                                                            
Now checking a                                                                                            
Now checking n                                                                                            
Now checking i                                                                                            
Now checking c 

那么为什么在运行完整代码时不会发生这种情况?

【问题讨论】:

标签: python list for-loop python-3.6


【解决方案1】:

您在迭代列表时正在对其进行编辑。正因为如此,大小会在中途改变,你最终会出现奇怪的行为。您可以改为创建一个新列表来保存过滤后的字符。

phrase = "Don't panic"
pList = list(phrase)
new_plist = []
wanted = ["o","n","t","a","p"]
for i, anything in enumerate(pList):
    print("Now checking", anything)
    if anything in wanted:
        print("Didn't remove", anything)
        new_plist.append(anything)
    else:
        print("Removed", anything)

print(new_plist)

使用列表推导的更简单的方法是

pList = ''.join([i for i in pList if i not in wanted])

【讨论】:

    【解决方案2】:

    其他答案和 cmets 都是 100% 正确的 - 迭代列表时切勿修改列表!可能有助于解决这类问题的方法是考虑逆向问题:不是从列表中删除,而是反转条件并将添加到一个新列表。通过这种方式,它基于输入而不是改变输入来构建新的输出 = 更少的副作用、更简洁的代码、函数式编程原则等。@coldspeed 的列表推导是一种优雅的解决方案。

    对您的原始代码更改最少的替代解决方案:

    phrase = "Don't panic"
    pList = list(phrase)
    print(pList)
    wanted = ["o","n","t","a","p"]
    finalList = []
    for anything in pList:
        print("Now checking", anything)
        if anything in wanted:
            finalList.append(anything)
            print("Didn't remove", anything)
        else:
            print("Removed",anything)
    
    print(finalList)
    

    现在pList 不会被修改,新的finalList 包含所需的结果。 (编辑:意识到@coldspeed 的代码现在几乎和这个完全一样——我最初提交的时候不是这样。)

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多