Python 将嵌入列表作为文件中的行写入列表中

Python 将嵌入列表作为文件中的行写入列表中,python,python-3.x,list,Python,Python 3.x,List,我有一个包含子列表的列表,每次包含一个字符串,另一个字符串,然后是一个包含如下字符串的列表: big_list = [['sentence', 'translation', ['error1', 'error2','error3']], ['sentence','translation',['error1','error2']],['sentence','translation',['error1', 'error2','error3','error4']]] sentence trans

我有一个包含子列表的列表,每次包含一个字符串,另一个字符串,然后是一个包含如下字符串的列表:

big_list = [['sentence', 'translation', ['error1', 'error2','error3']], ['sentence','translation',['error1','error2']],['sentence','translation',['error1', 'error2','error3','error4']]]
sentence   translation   error1, error2, error3
sentence   translation   error1, error2
sentence   translation   error1, error2, error3, error4
我想在单独的一行中打印每个嵌入列表,列表中的元素用制表符分隔,嵌入列表中的元素用逗号分隔 像这样:

big_list = [['sentence', 'translation', ['error1', 'error2','error3']], ['sentence','translation',['error1','error2']],['sentence','translation',['error1', 'error2','error3','error4']]]
sentence   translation   error1, error2, error3
sentence   translation   error1, error2
sentence   translation   error1, error2, error3, error4
如果子列表中的所有元素都是字符串,那么下面的代码可以正常工作

with open (outputfile, "w", encoding="utf-8") as f:
    f.writelines('\t'.join(i) + '\n' for i in big_list)
但是由于子列表中的第三个元素是一个列表,它变得更加复杂,我不知道解决这个问题的最佳方法是什么

我所能想到的就是首先将子列表中的嵌入列表转换为一个字符串,并使用subpublist中的“join(j)+”表示j

因此,我尝试了以下方法:

string_errors = ("".join(j) + "," for j in dict["trg_errors"])
但是它说类型是生成器对象而不是字符串。 因此,我仍然无法使用
writelines
函数。 我怎样才能把它做成一根绳子?
还有更有效的方法来解决这个问题吗?

在调用tab join之前,您可以构建一个新的字符串列表,然后调用它(您的想法是正确的):


这部分
,'.join(l[-1])
l
中的子列表转换为一个用逗号分隔的字符串。

您可以在尝试写之前转换为合理的数据结构。像这样的数据集的正常结构是一个字符串元组,所以让我们考虑一下如何得到它:

# pseudo-code:
[(sentence, translation, comma-separated_errors) for ? in big_list]
这将为我们找到我们正在寻找的结构,但是我们如何从我们将要开始的错误列表中找到
逗号分隔的\u错误
,以及我们正在迭代的
是什么?让我们一次看一个

您的错误列表是一个字符串列表,字符串迭代器有方便的
str.join
方法将它们粘合在一起,因此
“,”。join(error\u list)
将为我们提供这一功能

big\u list
是一个列表列表,其中每个内部列表都是
[句子、翻译、错误列表]
。这很容易从列表中取出

综合起来,我们有:

lines = [(sentence, translation, ', '.join(error_list)) for sentence, translation, error_list in big_list]

一旦我们有了正确的数据结构,就可以很容易地调用
'\t'。在
writelines
中为行中的行连接(行)

with open("outputfile.tsv", 'w') as f:
    f.writelines("\t".join(line) for line in lines)
我会这样做的

def get_rows(big_list):
    for small_list in big_list:
        colums = []
        for item in small_list:
            if isinstance(item, str):
                colums.append(item)
            elif isinstance(item, list):
                colums.append(', '.join(item))
        yield '\t'.join(colums)

with open ('tmp_big', "w", encoding="utf-8") as f:
    f.write('\n'.join(get_rows(big_list)))

将get_行作为生成器将节省我们的空间,因为大列表预计会很大