我有列表看起来像这样:
[['\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())
也许有一种不同的加载文件的方式会给我相同的结果。有没有办法做到这一点?谢谢!
答案 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']]