list.remove()方法未提供预期结果

Kud*_*dzu 1 python list

在尝试从列表中删除不以特定子字符串开头的所有文件名时,我遇到了以下意外行为:

>>> allfiles = os.listdir(mydir)
>>> allfiles
['dwcpybyext.sh', 'dwlaunch', 'libupdate.sh', 'ntpsync.sh']
>>> for f in allfiles:
...    if f.startswith('n') == False:
...        allfiles.remove(f)
...
>>> allfiles
['dwlaunch', 'ntpsync.sh']
Run Code Online (Sandbox Code Playgroud)

从理论上讲,这应该已经删除了不从列表开始的每个文件名'n'.相反,它留'd'在列表中的一个开头.如果我改变循环使用if f.startswith('d') == False:我得到['dwcpybyext.sh', 'dwlaunch', 'ntpsync.sh']- 最后一项甚至不包含一个'd'字符.

为什么我看到这种行为?它似乎不太可能是Python list.remove()方法中的错误- 如果我替换del allfiles[allfiles.index(f)],我会得到相同的行为,并且.remove()基本上只是一个别名.

Rom*_*huk 7

在迭代时修改列表是一个非常糟糕的主意.尝试下一个:

allfiles = filter(lambda x: x.startswith('n'), allfiles)
Run Code Online (Sandbox Code Playgroud)

  • 我使用list comprehension,它更清晰,并且在Python 3中返回一个列表.`[x for x in allfiles如果x.startswith('n')]` (7认同)