从列表中删除文件名 Python

1 投票
4 回答
631 浏览
提问于 2025-04-16 15:13

我有一个文件夹里的所有文件名,放在一个叫做 files 的列表里。我想把这个列表过滤一下,只保留后缀是 .php 的文件。

for x in files:
    if x.find(".php") == -1:
        files.remove(x)

但是这样做似乎会漏掉一些文件名。我该怎么办呢?

4 个回答

1

大多数回答都提供了列表或生成器的简洁写法,这种方式在90%的情况下都是你想要的,特别是当你不想修改原始列表的时候。

不过,有些情况下,比如因为列表太大,你想在原地修改原始列表,我通常会用下面这段代码:

idx = 0
while idx < len(files):
    if files[idx].find(".php") == -1:
        del files[idx]
    else:
        idx += 1

至于你原来的代码为什么不工作,是因为你在遍历列表的时候同时修改了它……“for x in files”其实是在隐式地创建一个迭代器,就像你用“for x in iter(files)”一样,而在列表中删除元素会让迭代器搞不清楚自己现在处于哪个位置。对于这种情况,我一般会用上面的代码,或者如果在项目中经常遇到这种情况,就把它提取成一个函数,比如:

def filter_in_place(func, target):
    idx = 0
    while idx < len(target):
        if func(target[idx)):
            idx += 1
        else:
            del target[idx]
5
>>> files = ['a.php', 'b.txt', 'c.html', 'd.php']
>>> [f for f in files if f.endswith('.php')]
['a.php', 'd.php']

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

11

你觉得用简单的列表推导式怎么样?

files = [f for f in files if f.endswith('.php')]

或者如果你更喜欢用生成器作为结果的话:

files = (f for f in files if f.endswith('.php'))

撰写回答