Python 如何将可变长度列表转换为CSV文件?

Python 如何将可变长度列表转换为CSV文件?,python,python-3.x,list,file,csv,Python,Python 3.x,List,File,Csv,我正在解决一个工作中的问题,该问题要求我将列列表转换为唯一的CSV格式。我之所以说“独一无二”,是因为我还没有看到关于我的特殊问题的解释。我的研究将我引向了两个类似的问题,比如由和提出的问题,我试过了,但结果不正确;让我解释一下 以下是我的数据示例: animals = [['dog', ['a','b','c','d'], ['aa','aa'], ['bb','bb','bb','bb','bb']],

我正在解决一个工作中的问题,该问题要求我将列列表转换为唯一的CSV格式。我之所以说“独一无二”,是因为我还没有看到关于我的特殊问题的解释。我的研究将我引向了两个类似的问题,比如由和提出的问题,我试过了,但结果不正确;让我解释一下

以下是我的数据示例:

animals = [['dog',
            ['a','b','c','d'],
            ['aa','aa'],
            ['bb','bb','bb','bb','bb']],
           ['cat',
            ['a','b','c'],
            [''],
            ['bb','bb']],
           ['bear',
            ['a'],
            ['aa','aa','aa'],
            ['bb']]]
该问题要求CSV的格式(在Excel中打开时)如下所示:

+------+------+------+------+
| dog  | a    | aa   | bb   |
+------+------+------+------+
|      | b    | aa   | bb   |
+------+------+------+------+
|      | c    |      | bb   |
+------+------+------+------+
|      | d    |      | bb   |
+------+------+------+------+
|      |      |      | bb   |
+------+------+------+------+
| cat  | a    |      | bb   |
+------+------+------+------+
|      | b    |      | bb   |
+------+------+------+------+
|      | c    |      |      |
+------+------+------+------+
| bear | a    | aa   | bb   |
+------+------+------+------+
|      |      | aa   |      |
+------+------+------+------+
|      |      | aa   |      |
+------+------+------+------+

pprint、
csv、
pandas
中是否有Python函数来执行此操作,或者我是否需要创建一个函数来生成csv输出以创建表?

我对数据的格式做了一些假设,因为您的问题中没有包含有效的Python


您可以使用
itertools.zip\u longest
将列旋转成行:

import csv
from itertools import zip_longest

animals = [
    [
        "dog",
        ["a", "b", "c", "d"],
        ["aa", "aa"],
        ["bb", "bb", "bb", "bb", "bb"],
    ],
    [
        "cat",
        ["a", "b", "c"], [""], ["bb", "bb"],
    ],
    [
        "bear", ["a"], ["aa", "aa", "aa"], ["bb"]
    ],
]

allrows = []
for data in animals:
    name = data.pop(0)
    rows = list(zip_longest(*data, fillvalue=''))
    for i in range(len(rows)):
        if i:
            rows[i] = ('',) + rows[i]
        else:
            rows[i] = (name,) + rows[i]

    allrows.extend(rows)

with open('output.csv', 'w') as fd:
    writer = csv.writer(fd)
    for row in allrows:
        writer.writerow(row)
以上将输出:

dog,a,aa,bb
,b,aa,bb
,c,,bb
,d,,bb
,,,bb
cat,a,,bb
,b,,bb
,c,,
bear,a,aa,bb
,,aa,
,,aa,
如果我们很好地格式化,它看起来像:

----  -  --  --
dog   a  aa  bb
      b  aa  bb
      c      bb
      d      bb
             bb
cat   a      bb
      b      bb
      c
bear  a  aa  bb
         aa
         aa
----  -  --  --

…我想这就是您要查找的内容。

根据您的数据,下面将提取动物名称,并将列数据转换到您要查找的行中

import csv
import itertools

animals = [['dog',
            ['a','b','c','d'],
            ['aa','aa'],
            ['bb','bb','bb','bb','bb']],
           ['cat',
            ['a','b','c'],
            [''],
            ['bb','bb']],
           ['bear',
            ['a'],
            ['aa','aa','aa'],
            ['bb']]]

# open() recommended for Excel to write any kind of Unicode string data
with open('data.csv','w',newline='',encoding='utf-8-sig') as f:
    w = csv.writer(f)
    for name,*data in animals:
        data.insert(0,[name]) # adjust animal name string to 1-element list.
        for row in itertools.zip_longest(*data):
            w.writerow(row)
data.csv:

dog,a,aa,bb
,b,aa,bb
,c,,bb
,d,,bb
,,,bb
cat,a,,bb
,b,,bb
,c,,
bear,a,aa,bb
,,aa,
,,aa,
卓越:

我不会将其描述为“可变长度列表列表”。我会说“列列表”,因为这是这里的基本困难:您想要将数据旋转90°。