Python 如何将可变长度列表转换为CSV文件?
我正在解决一个工作中的问题,该问题要求我将列列表转换为唯一的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']],
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°。