将带有嵌套元组的列表写入csv文件

时间:2013-11-19 18:23:11

标签: python csv python-3.x tuples

我有一个嵌套元组的列表,如下所示:

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]

但结果并不是理想的结果。关于如何解决这个问题的任何想法?

3 个答案:

答案 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]