繁体   English   中英

如何使用 while 循环制作列表的循环列表

[英]How to make recurrent list of lists with while-loop

我有一个格式turn_index \t sentence \t metadata的文件,看起来像这样,其中对话的长度(即转弯)是可变的:

0 你好元数据 1
1 嗨! 元数据2
0 你好 metadata3
1 你好吗? 元数据4
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

适合已编辑 output 的解决方案。对话将包含您提到的所有列表列表。

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 是始终 select 某物的两个后续元素的简洁表达式。 这绝对是值得记住的有用的东西。

下一行

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM