清除列表以删除半重复值

2024-10-01 04:57:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个视频链接列表。其中一些链接几乎是重复的,这意味着它们包含几乎相同的链接,只是它有x_480.mp4而不是x.mp4不是所有链接的末尾都有“\u 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。你知道吗


Tags: 版本示例列表视频len链接结尾videos
3条回答

这应该管用。它在视频中循环,直到找到一个以"_480.mp4"结尾的视频。然后它拆分标题并获取起始位,然后添加".mp4"以创建要删除的视频标题。然后它再次循环浏览视频并删除带有该标题的视频。你知道吗

videos=["x.mp4","y.mp4","z.mp4","x_480.mp4"]

#Loops through all the videos
for video in videos:
    if "_480.mp4" in video:
        #Removes the "_480" part of the video title
        start = video.replace("_480", "")
        for video2 in videos:
            if video2 == start:
                videos.remove(start)

print(videos)

我可能会走dict路线,不必检查列表中是否存在项(对于大型列表,这将成为一个(性能)问题)。例如:

list({v[:-8] if v.endswith("_480.mp4") else v[:-4]: v
      for v in sorted(videos)}.values())

这是一种简洁的说法。你知道吗

构造一个字典,它的键是incomingv,对于以"_480.mp4"结尾的值,没有最后8个字符,或者只是去掉最后4个字符,并为完整的incoming字符串赋值。你知道吗

只给我那个字典的值,因为输入是一个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后缀项在“plain”项之后sorted。这样,如果它们出现,就会覆盖为没有_480后缀的值创建的键。你知道吗

您可以用两行代码完成:

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中以便快速搜索。你知道吗

第二行使用列表来过滤不需要的内容 文件名。你知道吗

相关问题 更多 >