在python中使用for时丢失了一个元素,发生了什么?

2024-10-01 02:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个python程序如下:

from os import listdir 
def getfilename():
    namelist=listdir(".")
    print namelist
    for name in namelist:
        print name
        if 'lp' in name:
            namelist.remove(name)
    return namelist

当我在命令行上运行它并打印返回值时,结果是:

['all_test1.list', 'all_test2.list', 'lp.py', 'lp.pyc', 'lp.test', 'straightrnd_test1.list', 'straightrnd_test2.list', 'straightrnd_train.list']
all_test1.list
all_test2.list
lp.py
lp.test
straightrnd_test2.list
straightrnd_train.list
['all_test1.list', 'all_test2.list', 'lp.pyc', 'straightrnd_test1.list', 'straightrnd_test2.list', 'straightrnd_train.list']  

文件的私人股本'迷失在for循环中,所以返回值包含它,我想从列表中删除它,我该怎么办?为什么元素在for循环中丢失?你知道吗


Tags: nameinpyfortrainalllistlistdir
2条回答

您正在修改正在迭代的列表。使用列表理解:

newlist = [x for x in namelist if 'lp' not in x]

这个question很好地解决了这个问题,但简而言之:

即使您没有通过元素的索引显式地循环列表,Python还是会在内部为您完成这项工作。你知道吗

就好像你写了这样的东西:

l = listdir(".")
while i < len(l):
    name = l[i]
    if 'lp' in name:
        l.remove(name)
        # Now evaluating l[i] yields another element, even though i was not incremented !

    i = i + 1

因此,当您在迭代过程中移除一个元素时,它会将循环指针移动一次太多,这就是您观察到的问题。你知道吗

请注意,在您的情况下,您可以只写:

from os import listdir 

def getfilename():
    return [x for x in listdir(".") if not 'lp' in x]

尽管名称getfilename有点奇怪,但它实际上返回了一个列表。。。但这是另一个问题。你知道吗

相关问题 更多 >