繁体   English   中英

比较元组列表中的多个项目并从同一列表中删除元组

[英]Compare multiple items in a list of tuples and deleting tuples from the same list

目前,我正在使用Python分析字幕,因此我下载了一堆字幕,但是大多数系列在同一集中都有多个SRT文件。 我想删除重复项,因此我写了一个导致列表(re_results)的正则表达式,并用','。join(map(str(re_finds)))格式化,因此我得到了一个字符串作为列表元素,包含每个文件的系列名称,季节和情节。 这将使我能够扫描类似的字符串,然后将其作为字幕重复。

>>> re_duplicate = re.compile(r'^(.+)\s*-{1}\s*(\d+)x{1}(\d+)\s*-.*$')
>>> test_string = "CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt"
>>> re_duplicate.findall(test_string)[0]
('CSI ', '11', '01')
>>> ','.join(map(str, re_duplicate.findall(test_string)[0]))
'CSI ,11,01'

(字符串的外观无所谓,只要它可以标识名称,季节和情节编号即可。)因为我只对系列的实际讲话感兴趣,所以我只想保留最小的文件。 原因是较小的文件很可能不会包含我获得字幕的链接,创建者,为聋哑人提供的帮助(“ [脚步声接近]”,这不是语音)等等。

实际的问题:为了比较文件,我创建了以下元组列表:“ subtitle_tuple_list”

模式:[('正则表达式输出为字符串','文件包含文件名的路径',文件大小),...]

[('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt', 53340), 
('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059), 
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.en.srt', 62697), 
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159), …]

我现在想做的(但不能做):遍历列表并比较regex输出,对于每个相同的字符串,比较文件大小,使用路径和文件名删除除最小的字符串以外的所有字符串。

我知道一种方法是使用以下方法获取第一个元组的正则表达式输出:

[item[0] for item in subtitle_tuple_list]

然后,我必须在下一个元组中查找正则表达式输出,如果它们匹配比较文件大小,请从元组列表中删除较大文件的条目。 如果两者大小相同,则保留第一个。 将即将删除的文件保存在单独的列表中。 这样做直到获得新的正则表达式输出,这是另一集。 重复直到每个情节只剩下一个文件,这意味着新列表现在包含所有要删除的文件。 删除该列表中提到的所有文件。

我不知道如何写这部分。

另一个问题是:有没有更好的方法来删除不需要的字幕文件?

要根据需要过滤列表,可以使用熊猫:

>>> data = [('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt', 53340), ('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059), ('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.en.srt', 62697), ('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159)]

>>> import pandas as pd
>>> df = pd.DataFrame(data)
>>> df = df.groupby(0).min()
>>> df

                                                           1      2
0                                                                  
CSI ,1,01  path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQ...  52059
CSI ,1,02  path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL...  61159

要将其转换回列表:

df.values.tolist()

您可以使用defaultdict通过正则表达式收集列表中的所有文件。 然后按文件大小对列表进行排序:

from collections import defaultdict

data = [('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.FQM.en.srt', 53340), 
('CSI ,1,01', 'path_to_file\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059), 
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.en.srt', 62697), 
('CSI ,1,02', 'path_to_file\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159)]

dic = defaultdict(list)

for (reg, file, size) in data:
    dic[reg].append((file, size))

for key in dic:
    item=dic[key]
    item.sort(key=lambda t:t[1])
    print(item[0])

输出:

('path_to_file\\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059)
('path_to_file\\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159)

所以,让我说对了。 您有许多用于CSI的SRT。 并且您希望将其安排为每个CSI插播有一个 SRT。

所有文件都在同一目录中吗? 更好的可以将示例文件放在git repo上查看吗? 因为解决方案的可变性取决于它们的排列方式和内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM