Python - 从列表中删除具有相同名称但扩展名不同的项目

问题描述 投票:0回答:1

我有一个图片列表,对于每张 .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)

我得到这个输出:

有两个问题:

  1. 此代码始终删除列表中的第一项。第一个项目永远不应该被删除,因为它前面永远不会有 .jpg 文件。如何防止代码删除列表中的第一个元素?

  2. 有时有多个.jpg文件彼此相邻,在这种情况下我想保留所有这些文件,因为我只想删除具有相应.jpg.mov文件。

你能帮我改进我的代码,使其按预期工作吗?

python list image data-cleaning
1个回答
0
投票

我看到您的数据已经排序。在这种情况下,我会使用

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",
]
© www.soinside.com 2019 - 2024. All rights reserved.