首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较元组列表中的多个项并从同一列表中删除元组

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

Stack Overflow用户
提问于 2017-08-25 13:47:37
回答 3查看 166关注 0票数 1

目前我正在用Python分析字幕,所以我下载了一堆字幕,但大多数系列都有多个SRT文件供同一集使用。我想删除重复项,因此我编写了一个正则表达式,生成一个list (re_results),我用','.join(map(str,re_finds))格式化它,因此我得到一个字符串作为列表元素,它只包含每个文件的系列名称、季节和插集。这将使我能够扫描类似的字符串,这是一个副标题重复。

代码语言:javascript
复制
>>> 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”

模式:(“regex输出为字符串”,“文件名的路径”,文件大小),.

代码语言:javascript
复制
[('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输出,对于每个相同的字符串比较文件大小,使用路径和文件名删除所有最小的字符串。

我知道一种方法是使用以下方法获得第一个元组的regex输出:

代码语言:javascript
复制
[item[0] for item in subtitle_tuple_list]

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

我不知道怎么写这部分。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-25 14:10:20

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

代码语言:javascript
复制
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])

产出:

代码语言:javascript
复制
('path_to_file\\CSI - 11x01 - Shock Waves.HDTV.LOL.en.srt', 52059)
('path_to_file\\CSI - 11x02 - Pool Shark.HDTV.LOL.en.srt', 61159)
票数 1
EN

Stack Overflow用户

发布于 2017-08-25 14:08:32

若要按需要筛选列表,可以使用熊猫:

代码语言:javascript
复制
>>> 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

若要将其转换回列表,请执行以下操作:

代码语言:javascript
复制
df.values.tolist()
票数 1
EN

Stack Overflow用户

发布于 2017-08-25 14:04:26

所以让我把这个做对。很多CSI都有很多SRT。你想把它安排成每个CSI集都有一个1 SRT。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45882872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档