[英]Writing a list of dictionaries, with multiple values per key as new rows
作为开头,将会有很多重复的问题,但是这些问题的解决方案都没有真正帮助过我。 我有使用csv包编写字典列表的常用代码:
import csv
to_csv = list_dic
keys = to_csv[0].keys()
with open('output.csv', 'w') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(to_csv)
此代码在带有单个键值的字典列表上使用时效果很好(很好,除了输出csv每隔一行都有空白行的事实),但是现在我有了一个字典列表,每个键都有多个值,很像下面的例子:
list_dic = [{'a':[x,y],'b':[1,2],'c':[1,2]},
{'a':[x,y],'b':[1,2],'c':[1,2]},
{'a':[x,y],'b':[1,2],'c':[1,2]},
{'a':[x,y],'b':[1,2],'c':[1,2]}]
基本上我的csv输出当前看起来像这样:
'a' 'b' 'c'
[x,y] [1,2] [1,2]
[x,y] [1,2] [1,2]
[x,y] [1,2] [1,2]
[x,y] [1,2] [1,2]
我正在努力到达这里:
'a' 'b' 'c'
x 1 1
y 2 2
x 1 1
y 2 2
x 1 1
y 2 2
x 1 1
y 2 2
我已经提出了非常相似的问题,但是似乎无法将任何解决方案应用于我的特定情况。 我尝试使用某种for语句编写多行,但是失败了。
感谢您的帮助,如果您知道与这种情况重复的任何问题,请向我指出正确的方向。
编辑:示例每个键有2个值,但实际上值的数量是未知的,仅> 1
如果您对数据进行足够的压缩和解压缩,则将获得所需的格式:
list_dic = [{'a':['x','y'],'b':[1,2],'c':[1,2]},
{'a':['x','y'],'b':[1,2],'c':[1,2]},
{'a':['x','y'],'b':[1,2],'c':[1,2]},
{'a':['x','y'],'b':[1,2],'c':[1,2]}]
import csv
to_csv = list_dic
keys = to_csv[0].keys()
with open('output.csv', 'w') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
for dic in list_dic:
keys, values = zip(*dic.items())
for values in zip(*values):
dict_writer.writerow(dict(zip(keys, values)))
拆分字典,然后通过csv运行它们:
def split_dict(dct):
result = []
result.append({k: v[0] for k, v in dct.items()})
result.append({k: v[1] for k, v in dct.items()})
return result
def list_dict_split(lst):
result = []
for dct in lst:
result.extend(split_dict(dct))
return result
现在只要将list_dict_split(list_dic)
放到您拥有list_dic的任何地方:
中间列表是:
[{'a': 'x', 'c': 1, 'b': 1},
{'a': 'y', 'c': 2, 'b': 2},
{'a': 'x', 'c': 1, 'b': 1},
{'a': 'y', 'c': 2, 'b': 2},
{'a': 'x', 'c': 1, 'b': 1},
{'a': 'y', 'c': 2, 'b': 2},
{'a': 'x', 'c': 1, 'b': 1},
{'a': 'y', 'c': 2, 'b': 2}]
这是一种替代方法,对于该替代方法,只需一个zip
即可将columns
转置为rows
:
x = 'x'
y = 'y'
list_dic = [{'a': [x, y], 'b':[1, 2], 'c':[1, 2]},
{'a': [x, y], 'b':[3, 4], 'c':[1, 2]},
{'a': [x, y], 'b':[1, 2], 'c':[1, 2]},
{'a': [x, y], 'b':[3, 4], 'c':[1, 2]}]
keys = ['a', 'b', 'c']
sep = "\t"
print(sep.join(keys))
for dic in list_dic:
columns = [dic[key] for key in keys]
for row in zip(*columns):
print(sep.join(str(cell) for cell in row))
输出:
a b c
x 1 1
y 2 2
x 3 1
y 4 2
x 1 1
y 2 2
x 3 1
y 4 2
您可以将当前词典列表转换为分解词典列表,然后将其写入csv:
>>> import itertools as it
>>> [dict(n) for d in list_dic for n in zip(*(zip(it.repeat(k), v) for k, v in d.items()))]
[{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 2, 'c': 2},
{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 2, 'c': 2},
{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 2, 'c': 2},
{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 2, 'c': 2}]
这适用于任意数量的值:
>>> list_dic = [{'a':['x','y','z'],'b':[1,2,3],'c':[1,2,3]},
... {'a':['x','y','a'],'b':[1,3,2],'c':[1,2,1]},
... {'a':['x','y','b'],'b':[1,4,3],'c':[1,2,4]},
... {'a':['x','y','a'],'b':[1,5,2],'c':[1,2,9]}]
>>> [dict(n) for d in list_dic for n in zip(*(zip(it.repeat(k), v) for k, v in d.items()))]
[{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 2, 'c': 2},
{'a': 'z', 'b': 3, 'c': 3},
{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 3, 'c': 2},
{'a': 'a', 'b': 2, 'c': 1},
{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 4, 'c': 2},
{'a': 'b', 'b': 3, 'c': 4},
{'a': 'x', 'b': 1, 'c': 1},
{'a': 'y', 'b': 5, 'c': 2},
{'a': 'a', 'b': 2, 'c': 9}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.