我有一个嵌套元组的列表,如下所示:
data = [('apple', 19.0, ['gala', '14', 'fuji', '5', 'dawn', '3', 'taylor', '3']),
('pear', 35.0, ['anjou', '29', 'william', '6', 'concorde', '4'])]
我想将其弄平,以便我可以编写一个.csv文件,其中每个列表中的每个项目都对应一列:
apple 19.0, gala 14 fuji 5 dawn 3 taylor 3
pear 35.0 anjou 29 william 6 concorde 4
我尝试使用简单的展平:
flattened = [value for pair in data for value in pair]
但结果并不是理想的结果。关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
要将数据写出为CSV,只需使用csv
模块并将其分配给一行;构建行并不难:
import csv
with open(outputfile, 'w', newlines='') as ofh:
writer = csv.writer(ofh)
for row in data:
row = list(row[:2]) + row[2]
writer.writerow(row)
这会产生:
apple,19.0,gala,14,fuji,5,dawn,3,taylor,3
pear,35.0,anjou,29,william,6,concorde,4
答案 1 :(得分:2)
免责声明 - 效率不高的Python代码。
但是,它完成了这项工作。 (您可以调整宽度(目前为10))
data = [('apple', 19.0, ['gala', '14', 'fuji', '5', 'dawn', '3', 'taylor', '3']),
('pear', 35.0, ['anjou', '29', 'william', '6', 'concorde', '4'])]
flattened = list()
for i, each in enumerate(data):
flattened.append(list())
for item in each:
if isinstance(item, list):
flattened[i].extend(item)
else:
flattened[i].append(item)
# Now print the flattened list in the required prettified manner.
for each in flattened:
print ("".join(["{:<10}".format(item) for item in each]))
# String is formatted such that all items are width 10 & left-aligned
注意 - 我试图为更一般的情况编写函数 PS - 欢迎任何代码建议。我真的想改进这个。
答案 2 :(得分:0)
这似乎要求递归
def flatten(inlist):
outlist=[]
if isinstance(inlist, (list, tuple)):
for item in inlist:
outlist+=flatten(item)
else:
outlist+=[inlist]
return outlist
无论您的列表如何嵌套,这都应该有效。用它来测试:
>>> flatten([0,1,2,[3,4,[5,6],[7,8]]])
[0, 1, 2, 3, 4, 5, 6, 7, 8]