从列表中删除文件名 Python
我有一个文件夹里的所有文件名,放在一个叫做 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'))