到目前为止,我所能找到的只是将列表合并在一起的问题。
我正在寻找3个列表(2个列表和1个2D列表)
list1 = [[1,11,12],[2,21,22],[3,31,32]]
list2 = [4,5,6]
list3 = [7,8,9]
并将这些值写入CSV文件,从而产生以下结果// 所需输出
Row1,Row2,Row3
1,4,7
2,5,8
3,6,9
不应将<11> 11,12等写入CSV文件。
代码:
f = open('file.csv', 'wb')
fileWriter = csv.writer(f)
fileWriter.writerow(['Row1', 'Row2', 'Row3']) # Write header row
尝试:
listlen = len(list2)
list1len = len(list1)
for i in range(listlen):
for j in range(listlen):
for k in range(list1len):
fileWriter.writerow([list1[k][0],list2[i],list3[j]])
结果:
Row1,Row2,Row3
1,4,7
2,4,7
3,4,7
尝试:
for A,B,C in list1:
for X in list2:
for Y in list3:
tempA = A
tempX = X
tempY = Y
fileWriter.writerow([tempA,tempX,tempY])
结果:
Row1,Row2,Row3
1,4,7
1,4,8
1,4,9
etc.
当前代码(两次尝试)都会遍历list2和list3中list1中每个单个数字值的所有值。我在两次尝试之间设法做的就是改变写出的数字的顺序。
我想要做的是写出每个列表的第一个值,然后是第二个等,以提供所需的输出。
我如何调整此项以提供所需的输出/是否有更好的替代方案?
仅限Python 2.7
添加了我从Abhijit的回答中创建的解决方案:
result = zip(zip(*list1)[0], list2, list3)
for row in result:
tempRow = row
fileWriter.writerow(tempRow)
答案 0 :(得分:2)
假设您已经知道,编写一个csv,您可能想知道的部分是一种访问数据的优雅方式。
访问数据的一种很好的方法是使用内置的zip。 zip([iterable, ...])
具有转换数据的优雅能力,以及您需要的内容
>>> zip(zip(*list1)[0], list2, list3)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
不幸的是,您正在考虑的目标结果是格式化数据而不是csv,因此即使您将csv编写为制表符分隔符,结果也可能不合适
>>> result = [['row1','row2','row3']] + zip(zip(*list1)[0], list2, list3)
>>> with open('file.csv', 'wb') as fin:
writer = csv.writer(fin, delimiter = '\t')
writer.writerows(result)
row1 row2 row3
1 4 7
2 5 8
3 6 9
一种选择是放弃csv的想法,而是使用str.format
将数据写为格式化字符串。
>>> header = ['row1','row2','row3']
>>> result = zip(zip(*list1)[0], list2, list3)
>>> format_string = "{:<10}{:<10}{:<10}"
>>> with open('file.csv', 'wb') as fin:
fin.write(format_string.format(*header))
fin.write('\n')
for row in result:
fin.write(format_string.format(*row))
fin.write('\n')
row1 row2 row3
1 4 7
2 5 8
3 6 9