我有一个图片列表,对于每张 .jpg 格式的图片,我都有一个相应的同名 .mov 文件。我想删除仅具有相应 .jpg 文件的所有 .mov 文件,因为我想保留其他 .mov 文件,因为它们不代表图片而是视频,因此它们不配对与任何 .jpg 文件。
到目前为止,我已经编写了一个几乎可以完成我想做的所有事情的代码。在这里:
pics = ['IMG_0000.MOV', 'IMG_2812.JPG', 'IMG_2812.MOV', 'IMG_2815.JPG', 'IMG_2815.MOV', 'IMG_2853.AAE', 'IMG_2862.MOV', 'IMG_2944.JPG', 'IMG_2944.MOV', 'IMG_2955.JPG', 'IMG_2958.JPG', 'IMG_2958.MOV', 'IMG_2965.JPG', 'IMG_2965.MOV']
print('Original list:', pics)
print('------')
# Get rid of all the files different from .mov and .jpg
lista = []
for i in pics:
if i.endswith('.JPG') or i.endswith('.MOV'):
lista.append(i)
#print(lista)
# Remove all .mov files that are immediately preceded by a .jpg file
nuevo = [a for a, b in zip(lista, [''] + lista) if b.endswith(".MOV")]
print('Output list:', nuevo)
有两个问题:
此代码始终删除列表中的第一项。第一个项目永远不应该被删除,因为它前面永远不会有 .jpg 文件。如何防止代码删除列表中的第一个元素?
有时有多个.jpg文件彼此相邻,在这种情况下我想保留所有这些文件,因为我只想删除具有相应.jpg的.mov文件。
你能帮我改进我的代码,使其按预期工作吗?
我看到您的数据已经排序。在这种情况下,我会使用
itertools.groupby
对文件进行分组,并过滤掉组长度大于 1 的 .MOV
:
from itertools import groupby
lst = [
"IMG_0000.MOV",
"IMG_2812.JPG",
"IMG_2812.MOV",
"IMG_2815.JPG",
"IMG_2815.MOV",
"IMG_2853.AAE",
"IMG_2862.MOV",
"IMG_2944.JPG",
"IMG_2944.MOV",
"IMG_2955.JPG",
"IMG_2958.JPG",
"IMG_2958.MOV",
"IMG_2965.JPG",
"IMG_2965.MOV",
]
out = []
for name, group in groupby(lst, lambda k: k.rsplit(".", 1)[0]):
group = list(group)
out.extend(f for f in group if not (f.endswith(".MOV") and len(group) > 1))
print(out)
打印:
[
"IMG_0000.MOV",
"IMG_2812.JPG",
"IMG_2815.JPG",
"IMG_2853.AAE",
"IMG_2862.MOV",
"IMG_2944.JPG",
"IMG_2955.JPG",
"IMG_2958.JPG",
"IMG_2965.JPG",
]