根据关键字合并列表中的子列表

2024-09-26 18:01:50 发布

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

我的列表如下所示:

 [['\ufeff'],
 ['<dialog #1 (338)>'],
 ['02:48\tVšechny větrací otvory nesmí být zakryty'],
 ['02:50\tV přihrádkách na potraviny'],
 ['02:52\tNepoškoďte potrubní vedení chladícího média'],
 ['02:56\tPři definitivním postavení zařízení'],
 ['02:56\tPři konečném postavení zařízení'],
 ['02:57\tPři konečném postavení'],
 ['02:57\tPři konečném postavení'],
 ['02:58\tdefinitivním postavení'],
 ['02:58\tdefinitivním postavení'],
 ...........and so on.

看到第二行的“对话”了吗?它在整个文件中重复数万次。我想合并所有子列表,从第一个子列表包含单词“dialog”到最后一个子列表不包含该单词。所以我最终得到的子列表在开头只包含一个“dialog”单词

也可以(而且更方便)更改导入这些txt文件的方式。我使用这个代码:

dialogues1 = []
with open('dialogy1.txt', encoding="utf-8") as inputfile:
    for line in inputfile:
        dialogues1.append(line.splitlines())

也许有一种不同的加载文件的方法会给我相同的结果。有办法吗?谢谢


Tags: 文件txt列表linetv单词dialogtp
1条回答
网友
1楼 · 发布于 2024-09-26 18:01:50

要移动包含"dialog"内容的所有列表,可以使用itertools.groupby

import itertools
import re
s = [['\ufeff'], ['<dialog #1 (338)>'], ['02:48\tVšechny větrací otvory nesmí být zakryty'], ['02:50\tV přihrádkách na potraviny'],['02:52\tNepoškoďte potrubní vedení chladícího média'], ['02:56\tPři definitivním postavení zařízení'], ['02:56\tPři konečném postavení zařízení'], ['02:57\tPři konečném postavení'], ['02:57\tPři konečném postavení'], ['02:58\tdefinitivním postavení'], ['02:58\tdefinitivním postavení']]
new_data = sorted([(a, list(b)) for a, b in itertools.groupby(sorted(s[1:], key=lambda x: bool(re.findall('\<dialog #\d+', x[0]))), key=lambda x:bool(re.findall('\<dialog #\d+', x[0])))], key=lambda x:x, reverse=True)
final_data = list(map(''.join, [c for h in [b for a, b in new_data] for c in h]))

输出:

['<dialog #1 (338)>', '02:48\tV\xc5\xa1echny v\xc4\x9btrac\xc3\xad otvory nesm\xc3\xad b\xc3\xbdt zakryty', '02:50\tV p\xc5\x99ihr\xc3\xa1dk\xc3\xa1ch na potraviny', '02:52\tNepo\xc5\xa1ko\xc4\x8fte potrubn\xc3\xad veden\xc3\xad chlad\xc3\xadc\xc3\xadho m\xc3\xa9dia', '02:56\tP\xc5\x99i definitivn\xc3\xadm postaven\xc3\xad za\xc5\x99\xc3\xadzen\xc3\xad', '02:56\tP\xc5\x99i kone\xc4\x8dn\xc3\xa9m postaven\xc3\xad za\xc5\x99\xc3\xadzen\xc3\xad', '02:57\tP\xc5\x99i kone\xc4\x8dn\xc3\xa9m postaven\xc3\xad', '02:57\tP\xc5\x99i kone\xc4\x8dn\xc3\xa9m postaven\xc3\xad', '02:58\tdefinitivn\xc3\xadm postaven\xc3\xad', '02:58\tdefinitivn\xc3\xadm postaven\xc3\xad']

编辑:关于上一条评论中所需的输出,此解决方案应该可以:

s = [['\ufeff'], ['<dialog #1 (338)>'], ['02:48\tVšechny větrací otvory nesmí být zakryty'], ['02:50\tV přihrádkách na potraviny'],['02:52\tNepoškoďte potrubní vedení chladícího média'], ['02:56\tPři definitivním postavení zařízení'], ['02:56\tPři konečném postavení zařízení'], ['<dialog #2 (338)>'], ['02:57\tPři konečném postavení'], ['02:57\tPři konečném postavení'], ['02:58\tdefinitivním postavení'], ['02:58\tdefinitivním postavení']]
new_data = [list(b) for a, b in itertools.groupby(s[1:], key=lambda x:bool(re.findall('\<dialog #\d+', x[0])))]
final_data = [[c for h in new_data[i:i+2] for c in h] for i in range(0, len(new_data), 2)]

输出:

[['<dialog #1 (338)>'], ['02:48\tV\xc5\xa1echny v\xc4\x9btrac\xc3\xad otvory nesm\xc3\xad b\xc3\xbdt zakryty'], ['02:50\tV p\xc5\x99ihr\xc3\xa1dk\xc3\xa1ch na potraviny'], ['02:52\tNepo\xc5\xa1ko\xc4\x8fte potrubn\xc3\xad veden\xc3\xad chlad\xc3\xadc\xc3\xadho m\xc3\xa9dia'], ['02:56\tP\xc5\x99i definitivn\xc3\xadm postaven\xc3\xad za\xc5\x99\xc3\xadzen\xc3\xad'], ['02:56\tP\xc5\x99i kone\xc4\x8dn\xc3\xa9m postaven\xc3\xad za\xc5\x99\xc3\xadzen\xc3\xad']][['<dialog #2 (338)>'], ['02:57\tP\xc5\x99i kone\xc4\x8dn\xc3\xa9m postaven\xc3\xad'], ['02:57\tP\xc5\x99i kone\xc4\x8dn\xc3\xa9m postaven\xc3\xad'], ['02:58\tdefinitivn\xc3\xadm postaven\xc3\xad'], ['02:58\tdefinitivn\xc3\xadm postaven\xc3\xad']]

相关问题 更多 >

    热门问题