根据关键字合并列表中的子列表
Merging sublists in a list according to a keyword
我有如下列表列表:
[['\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.
看到第 2 行的 "dialog" 字了吗?它在整个文件中重复了数万次。我想将包含单词 "dialog" 的第一个子列表的所有子列表合并到不包含该单词的最后一个子列表。所以我最终得到的子列表在开头只包含一个 "dialog" 单词。
也可能(而且更方便)更改我导入这些 txt 文件的方式。我使用这个代码:
dialogues1 = []
with open('dialogy1.txt', encoding="utf-8") as inputfile:
for line in inputfile:
dialogues1.append(line.splitlines())
也许有一种不同的加载文件的方式会给我相同的结果。有没有办法做到这一点?谢谢!
要移动所有包含 "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']]
我有如下列表列表:
[['\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.
看到第 2 行的 "dialog" 字了吗?它在整个文件中重复了数万次。我想将包含单词 "dialog" 的第一个子列表的所有子列表合并到不包含该单词的最后一个子列表。所以我最终得到的子列表在开头只包含一个 "dialog" 单词。
也可能(而且更方便)更改我导入这些 txt 文件的方式。我使用这个代码:
dialogues1 = []
with open('dialogy1.txt', encoding="utf-8") as inputfile:
for line in inputfile:
dialogues1.append(line.splitlines())
也许有一种不同的加载文件的方式会给我相同的结果。有没有办法做到这一点?谢谢!
要移动所有包含 "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']]