在Python中将字典解析成电子表格

时间:2015-10-24 23:37:32

标签: python dictionary defaultdict

我有一些类似格式的数据:

James has 6 jeans, 10 shirts, 5 shoes, 6 ties
Nick has 8 jeans, 4 shirts, 3 shoes, 4 ties
Adam has 2 jeans, 3 shirts, 5 shoes, 1 tie
John has 6 jeans, 5 shirts, 10 shoes, 3 ties

使用collections.defaultdict(list),我按以下格式制作了一本字典:

{James: [[Jeans, 6],
         [Shirts, 10],
         [Shoes, 5],
         [Ties, 6]],
 Nick: [[Jeans, 8],
        [Shirts, 4],
        [Shoes, 3],
        [Ties, 4]],
 Adam: [[Jeans, 2],
        [Shirts, 3],
        [Shoes, 5],
        [Ties, 1]],
 John: [[Jeans, 6],
        [Shirts, 5],
        [Shoes, 10],
        [Ties, 3]]}

我想在cvs电子表格中获取此输出:

Accesories  James    Nick       Adam     John

Jeans         6       8           2        6

Shirts       10       4           3        5

Shoes        5        3           5        10

Ties         6        4           1         3

在构建字典之前进行一些编码之后,这是我到目前为止尝试使用创建的字典生成与上面的格式相同的电子表格的代码。已导入cvsitertools个模块。

with open(outputcsv, 'w') as w:
    writer = csv.writer(w, delimiter=',', lineterminator='\n')
    writer.writerow(dict.keys())

    zipped = itertools.izip_longest(*dict.values())
    writer.writerows(list(zipped))

这让我非常接近预期的解决方案,但并不完全。

1 个答案:

答案 0 :(得分:2)

这可能更容易作为词典的词典,而不是列表列表的词典。

假设:

w={'James': {'Jeans': 6,
     'Shirts': 10,
     'Shoes': 5,
     'Ties': 6,},
 'Nick': {'Jeans': 8,
    'Shirts': 4,
    'Shoes': 3,
    'Ties': 4},
 'Adam': {'Jeans': 2,
    'Shirts': 3,
    'Shoes': 5,
    'Ties': 1},
 'John': {'Jeans': 6,
    'Shirts': 5,
    'Shoes': 10,
    'Ties': 3,
    'Belts': 1}}

注意John有一条腰带而其他人没有,这是一个dicts的词典而不是两个元素列表的列表。

首先,让我们得到任何人拥有的所有配件的清单(好的,一套......):

accessories=set()    
for nam, di in w.items():
    for k in di:
        accessories.add(k)  
>>> accessories
set(['Ties', 'Belts', 'Jeans', 'Shirts', 'Shoes'])

现在可以直接以您的格式创建这些项目的CSV:

import csv

with open('/tmp/so.csv', 'w') as f:
    writer=csv.writer(f)
    writer.writerow(['accessories']+w.keys()) 
    for item in accessories:
        li=[item]
        for nam in w:
            li.append(w[nam].get(item, 0))
        writer.writerow(li)   

现在查看文件:

accessories,James,John,Adam,Nick
Ties,6,3,1,4
Belts,0,1,0,0
Jeans,6,6,2,8
Shirts,10,5,3,4
Shoes,5,10,5,3

如果你坚持使用列表列表中的每两个元素(如你的示例中所示),你可以转换它们:

>>> w={'James': [['Jeans', 6],
...      ['Shirts', 10],
...      ['Shoes', 5],
...      ['Ties', 6]],
...  'Nick': [['Jeans', 8],
...     ['Shirts', 4],
...     ['Shoes', 3],
...     ['Ties', 4]],
...  'Adam': [['Jeans', 2],
...     ['Shirts', 3],
...     ['Shoes', 5],
...     ['Ties', 1]],
...  'John': [['Jeans', 6],
...     ['Shirts', 5],
...     ['Shoes', 10],
...     ['Ties', 3],
...     ['Belts', 1]]}
>>> {k:dict(LoL) for k, LoL in w.items()}
{'James': {'Ties': 6, 'Jeans': 6, 'Shirts': 10, 'Shoes': 5}, 'John': {'Ties': 3, 'Belts': 1, 'Jeans': 6, 'Shirts': 5, 'Shoes': 10}, 'Adam': {'Ties': 1, 'Jeans': 2, 'Shirts': 3, 'Shoes': 5}, 'Nick': {'Ties': 4, 'Jeans': 8, 'Shirts': 4, 'Shoes': 3}}