从不同大小的词典python3.x创建数据结构

时间:2016-12-01 17:01:39

标签: python csv dictionary

我想创建一个词典列表并导出到csv文件。这些词典的长度各不相同 - 基本上我想做类似以下的事情:

a = {'name': 'Alison', 'food1': 'bananas', 'food2': 'apples', 'food3': 'dates'}
b = {'name': 'Ken', 'food1': 'noodles', 'food2': 'rice'}
c = {'name': 'Max', 'food1': 'jello', 'food2': 'yogurt', 'food3': 'bananas', 'food4': 'milk}

输出csv

   name      |    food1    |     food2     |    food3    |     food4
------------------------------------------------------------------------
  Alison     |   bananas   |     apples    |     dates   |      ' '
  Ken        |   noodles   |      rice     |      ' '    |      ' '
  Max        |    jello    |     yogurt    |    bananas  |      milk

# list of dictionaries
data = [a, b, c]

目前,我的代码允许从字典列表中创建数据结构,只要该列表中的每个字典具有相同数量的键。

keys = data[0].keys()

with open('profiles.csv', 'w', newline = '') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(data)

有人有办法将长度不一的字典列表合并到csv中,如上所示吗?

2 个答案:

答案 0 :(得分:2)

这是一个可能的熊猫解决方案。这也使用df.to_csv方法写入文件更方便。如果您更喜欢' 'NaN,则可以添加df = df.fillna(' ')

import pandas as pd

a = {'name': 'Alison', 'food1': 'bananas', 'food2': 'apples', 'food3': 'dates'}
b = {'name': 'Ken', 'food1': 'noodles', 'food2': 'rice'}
c = {'name': 'Max', 'food1': 'jello', 'food2': 'yogurt', 'food3': 'bananas', 'food4': 'milk'}

dcts = [a,b,c]

df = pd.concat((pd.Series(dct) for dct in dcts), axis=1).T.set_index('name')

#           food1   food2    food3 food4
# name
# Alison  bananas  apples    dates   NaN
# Ken     noodles    rice      NaN   NaN
# Max       jello  yogurt  bananas  milk

答案 1 :(得分:1)

@Yakym Pirozhenko为熊猫提供了一个很好的解决方案..

这是一个只有python和标准库csv

1。收集所有可能的密钥:

allkeys = set()
for d in data:
    allkeys.extend(d.keys())
allkeys = list(allkeys) #freeze list order

2. 写入文件

with open(csvfile, 'wb') as f:
    writer = csv.DictWriter(f, fieldnames=allkeys, restval='', extrasaction='ignore')
    writer.writeheader()
    for d in data:
        writer.writerow(d)