我想为下面列表中的每个三个元素编写三个单独的文本文件:
my_list = ['text1', 'text1', 'text1', 'text2', 'text2', 'text2', 'text3', 'text3', 'text3']
result = [my_list[idx:idx + 3] for idx in range(0, len(my_list), 3)]
outfiles = ['file1', 'file2', 'file3']
for f in outfiles:
with open ('{}.txt'.format(f),'w') as fo:
for x in result:
for y in x:
fo.write(str(y) + '\n')
请帮我纠正上面的代码。
file1应该包含:
text1
text1
text1
file2的:
text2
text2
text2
file3的:
text3
text3
text3
但我上面的代码写道:
text1
text1
text1
text2
text2
text2
text3
text3
text3
答案 0 :(得分:0)
我可能会在这里使用itertools.groupby
...
for i, (k, group) in enumerate(groupby(my_list), 1):
with open('file{}.txt'.format(i), 'w') as fout:
fout.writelines(item + '\n' for item in group)
# fout.write('\n'.join(group)) # another alternative which doesn't write a newline at the end of the file.
这假定初始列表已经排序,并且将相同的东西一遍又一遍地写入文件似乎有点傻,但如果你真的有一个更多样化的列表,你总是可以按一些结果排序和分组键函数,它将应用于列表中的每个元素......
答案 1 :(得分:0)
您可以尝试使用循环迭代列表的一部分。在这里,我们使用变量i
来指示每次迭代中将使用哪个列表片段:
my_list = ['text1', 'text1', 'text1', 'text2', 'text2', 'text2', 'text3', 'text3', 'text3']
outfiles = ['file1', 'file2', 'file3']
i = 0 # to keep count of which words will be written
for f in outfiles:
with open ('{}.txt'.format(f), 'w') as fo:
for word in my_list[i:i + 3]:
fo.write(word + "\n")
i += 3
答案 2 :(得分:0)
outfiles = ['file1', 'file2', 'file3']
my_list = ['text1', 'text1', 'text1', 'text2', 'text2', 'text2', 'text3', 'text3', 'text3']
for i in range(0, len(my_list), len(outfiles)):
with open(my_list, 'a') as outfile:
for line in outfiles[i:i+len(my_list)]:
outfile.write(line)
outfile.write('\n')
通过对代码的最小编辑,可以完成以下操作:
outfiles = ['file1', 'file2', 'file3']
my_list = ['text1', 'text1', 'text1', 'text2', 'text2', 'text2', 'text3', 'text3', 'text3']
round = 0
i = 0
while len(files)*round + i < len(my_list):
for i,outfilepath in enumerate(outfiles):
with open(outfilepath) as outfile:
outfile.write(my_list[len(files)*round + i])
i += 1