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

时间:2018-01-29 22:52:53

标签: python list sublist

我有列表看起来像这样:

 [['\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.

看到&#34;对话框&#34; 2号线上的字?它在整个文件中重复了数万次。我想合并第一个子列表中的所有子列表,其中包含单词&#34; dialog&#34;到最后一个不包含该单词的子列表。所以我最终得到的子列表只包含一个&#34;对话框&#34;开头说。

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

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

也许有一种不同的加载文件的方式会给我相同的结果。有没有办法做到这一点?谢谢!

1 个答案:

答案 0 :(得分:0)

要移动包含"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']]