清除列表以删除半重复值

时间:2019-01-12 16:28:27

标签: python python-3.x list

我有一个视频链接列表。其中一些链接是几乎重复的,这意味着它们包含几乎相同的链接,只是链接具有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。

4 个答案:

答案 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