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_行作为生成器将节省我们的空间,因为大列表预计会很大