如何使用while循环生成列表的循环列表



我有一个格式为turn_index t sentence t metadata的文件,如下所示,其中对话的长度(即轮次(是可变的:

0你好元数据1
1你好!元数据2
0你好元数据3
1你好吗?metadata4
2非常好meta5
3我今天很忙meta6

我想在一个列表中对两个回合进行分组,并将所有相同的对话列表分组到大列表中:
[["hello", "hi!"]]
[["hi there", "how are you?"], ["how are you?", "very well"]["very well", "I'm so busy today"]]
我尝试一次对两个句子进行窗口化,但没有成功,我甚至无法开始弄清楚如何对每个对话进行分组。我的代码如下:

turns = data.readlines()
window_size = 2
i = 0
j = 0
dialogue = []
while i < len(turns) - window_size + 1:
restart = False
dialogue=[]
for turn in turns:
sec = turn.rstrip().split("t")
double_sent = [sec[0], sec[1]]
i += 1

适合编辑输出的解决方案。对话框将保存您提到的所有列表。

dialogues = []
double_sent = []
for line1, line2 in zip(turns[:-1], turns[1:]):
if int(line2.split('t')[0])-int(line1.split('t')[0]) == 1:
double_sent.append([line1.split('t')[1], line2.split('t')[1]])
else:
dialogues.append(double_sent)
double_sent = []
dialogues.append(double_sent.copy())

此处

zip(turns[:-1], turns[1:])

is是一个巧妙的表达,总是选择事物的两个后续元素。这绝对是一件值得记住的事情。

下一行

if int(line2.split('t')[0])-int(line1.split('t')[0]) == 1

检查选定线路的转弯编号是否相互跟随。只有当切换回0时,此条件才会失败,这表示对话已完成,并且可以附加到对话列表中。如果编号有错误,这将给出错误的输出。

# Output
>>> dialogues
>>> [[['hello', 'hi!']], [['hi there', 'how are you?'], ['how are you?', 'very well'], ['very well', "I'm so busy today"]]]

最新更新