Python实现移除列表中对应同名JPG文件的MOV文件
移除存在对应同名JPG的MOV文件需求实现
需求明确:给定一个文件名列表,需移除所有存在同名JPG文件的MOV文件,同时保留:
- 所有JPG文件
- 没有对应同名JPG的独立MOV文件
你原本编写的代码如下:
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)
原代码的核心问题
- 错误删除列表第一个元素:通过
[''] + lista与lista做zip,第一个元素的对比值是空字符串,不满足b.endswith(".MOV")导致被过滤,但如果第一个是独立MOV,理应保留。 - 无法处理连续JPG的情况:原逻辑仅通过“前置是否为MOV”判断,连续JPG时,后续JPG会因前置是JPG被过滤,不符合保留所有JPG的要求。
改进思路与代码
正确逻辑应先收集所有JPG文件的基础文件名(去掉后缀),再遍历列表筛选:
- 所有JPG文件直接保留
- 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('------') # 收集所有JPG文件的基础文件名(不含后缀) jpg_basenames = set() for filename in pics: if filename.endswith('.JPG'): basename = filename.rsplit('.', 1)[0] jpg_basenames.add(basename) # 筛选目标文件 result = [] for filename in pics: if filename.endswith('.JPG'): result.append(filename) elif filename.endswith('.MOV'): basename = filename.rsplit('.', 1)[0] if basename not in jpg_basenames: result.append(filename) # 其他格式文件直接跳过 print('Output list:', result)
运行结果
输出完全符合需求:
Original list: ['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'] ------ Output list: ['IMG_0000.MOV', 'IMG_2812.JPG', 'IMG_2815.JPG', 'IMG_2862.MOV', 'IMG_2944.JPG', 'IMG_2955.JPG', 'IMG_2958.JPG', 'IMG_2965.JPG']
- 保留了独立MOV文件:
IMG_0000.MOV、IMG_2862.MOV - 保留了所有JPG文件,包括连续出现的
IMG_2955.JPG、IMG_2958.JPG - 自动移除了所有存在对应同名JPG的MOV文件
内容的提问来源于stack exchange,提问作者Javi
相关产品推荐
相关产品推荐

