我有一个视频链接列表。其中一些链接是几乎重复的,这意味着它们包含几乎相同的链接,只是链接具有x_480.mp4
而不是x.mp4
。 不是,所有链接的末尾都带有“ _480”。
如何清除列表以仅获取以_480.mp4
结尾的版本,并删除其替代版本,并保留没有_480.mp4
版本的版本?
示例:
videos=["VfeHB0sga.mp4","G9uKZiNm.mp4","VfeHB0sga_480.mp4","kvlX4Fa4.mp4"]
预期结果:
["G9uKZiNm.mp4","VfeHB0sga_480.mp4","kvlX4Fa4.mp4"]`
注意:所有链接均以.mp4
结尾。另外,没有_480.mp4
,就没有原始的。
len(videos)
是243。
答案 0 :(得分:2)
您可以通过两行代码来实现:
to_remove = {fn[:-8] + '.mp4' for fn in videos if fn.endswith('_480.mp4')}
cleaned = [fn for fn in videos if fn not in to_remove]
第一行使用集合理解来提取所有_480.mp4
文件名,将其转换为不需要的简短版本。他们是
存储在set
中以便快速搜索。
第二行使用列表理解来过滤掉不需要的内容 文件名。
答案 1 :(得分:1)
我可能会走dict
路线而不必检查列表中项目的存在(对于大列表,这将成为(性能)问题)。例如:
list({v[:-8] if v.endswith("_480.mp4") else v[:-4]: v
for v in sorted(videos)}.values())
这是一种简洁的说法。
为我构建一个字典,其键为传入的v
,其后缀为"_480.mp4"
的末尾8个字符,否则仅除去最后的四个字符并被分配完整的传入字符串的值。
只给我该字典的值,由于输入是list
,因此我将其传递给列表构造函数以获取与输出相同的类型。
或者为了便于阅读而分解,看起来可能像这样:
videos=["x.mp4","y.mp4","z.mp4","x_480.mp4"]
video_d = {}
for video_name in sorted(videos):
if video_name.endswith("_480.mp4"):
video_d[video_name[:-8]] = video_name
else:
video_d[video_name[:-4]] = video_name
new_videos = list(video_d.values())
它使用虚拟基本名(将_480.mp4
或.mp4
剥离)作为字典键。由于您不在乎结果的列表顺序,因此我们确保在“普通”条目之后的_480
后缀条目为sorted
。这样,如果它们出现,它们将覆盖为不带后缀_480
的值创建的键。
答案 2 :(得分:0)
这应该有效。它会循环播放视频,直到找到以Test Libraries
结尾的视频为止。然后,它拆分标题并获得起始位,并添加"_480.mp4"
以创建要删除的视频标题。然后,它将再次循环播放视频,并删除具有该标题的视频。
".mp4"
答案 3 :(得分:0)
您甚至可以通过一次班轮列表理解来做到这一点。
result = 1