简体   繁体   English

将字典的字典拼合为python中的列表

[英]flatten a dictionary of dictionaries in to a list in python

I have a dictionary of dictionaries and need to flatten it into a list. 我有一本字典的字典,需要将其放到列表中。 My goal here is to have it in a form that I can send to a MySQL database. 我的目标是以一种可以发送到MySQL数据库的形式进行存储。 The dictionary is in the form 字典的形式

{
 'Customer 1': 
   {'Vitamin A': 0, 'Calcium': 1, 'Protein': 1, 'B vitamins': 0, 'HPMR': 0},
 'Customer 2': 
   {'Vitamin A': 0, 'Calcium': 0, 'Protein': 1, 'B vitamins': 1, 'HPMR': 0}
 }

I want it to end up like: 我希望它最终像:

('Customer 1', 'Vitamin A', 0), ('Customer 1', 'Calcium', 1)
...
('Customer 2', 'Vitamin A', 0), ('Customer 2', 'Calcium', 0)`

Thanks for your help 谢谢你的帮助

customers = {'Customer 1': {'Vitamin A': 0, 
                            'Calcium': 1, 
                            'Protein': 1, 
                            'B vitamins': 0, 
                            'HPMR': 0}, 
             'Customer 2': {'Vitamin A': 0, 
                            'Calcium': 0, 
                            'Protein': 1, 
                            'B vitamins': 1, 
                            'HPMR': 0}}
all_orders = []
for customer, order in customers.items():
    customer_orders = [(customer, vitamin, quantity) for vitamin, quantity in order.items()]
    all_orders.append(customer_orders)

all_orders = [[('Customer 2', 'Calcium', 0),
               ('Customer 2', 'Vitamin A', 0),
               ('Customer 2', 'HPMR', 0),
               ('Customer 2', 'Protein', 1),
               ('Customer 2', 'B vitamins', 1)],
              [('Customer 1', 'Calcium', 1),
               ('Customer 1', 'Vitamin A', 0),
               ('Customer 1', 'HPMR', 0),
               ('Customer 1', 'Protein', 1),
               ('Customer 1', 'B vitamins', 0)]]
In [6]: dic={'Customer 1': {'Vitamin A': 0, 'Calcium': 1, 'Protein': 1, 'B vitamins': 0, 'HPMR': 0}, 'Customer 2': {'Vitamin A': 0, 'Calcium': 0, 'Protein': 1, 'B vitamins': 1, 'HPMR': 0}}

In [7]: [tuple([x]+list(y)) for x in dic for y in dic[x].items() ]

Out[7]: 
[('Customer 2', 'Calcium', 0),
 ('Customer 2', 'Vitamin A', 0),
 ('Customer 2', 'HPMR', 0),
 ('Customer 2', 'Protein', 1),
 ('Customer 2', 'B vitamins', 1),
 ('Customer 1', 'Calcium', 1),
 ('Customer 1', 'Vitamin A', 0),
 ('Customer 1', 'HPMR', 0),
 ('Customer 1', 'Protein', 1),
 ('Customer 1', 'B vitamins', 0)]

or using itertools.chain() : 或使用itertools.chain()

In [8]: from itertools import chain

In [9]: [tuple(chain(*([x],y))) for x in dic for y in dic[x].items() ]
Out[9]: 
[('Customer 2', 'Calcium', 0),
 ('Customer 2', 'Vitamin A', 0),
 ('Customer 2', 'HPMR', 0),
 ('Customer 2', 'Protein', 1),
 ('Customer 2', 'B vitamins', 1),
 ('Customer 1', 'Calcium', 1),
 ('Customer 1', 'Vitamin A', 0),
 ('Customer 1', 'HPMR', 0),
 ('Customer 1', 'Protein', 1),
 ('Customer 1', 'B vitamins', 0)]
[(k, k2, v) for k in dct for k2, v in k.items()]
dictio = {'Customer 1': {'Vitamin A': 0, 'Calcium': 1, 'Protein': 1, 'B vitamins': 0, 'HPMR': 0}, 'Customer 2': {'Vitamin A': 0, 'Calcium': 0, 'Protein': 1, 'B vitamins': 1, 'HPMR': 0}}
a = []
for key in dictio.keys():
    for key_ in dictio[key].keys():
        a.append((key,key_,dictio[key][key_]))

print a

Output: [('Customer 2', 'Calcium', 0), ('Customer 2', 'Vitamin A', 0), ('Customer 2', 'HPMR', 0), ('Customer 2', 'Protein', 1), ('Customer 2', 'B vitamins', 1), ('Customer 1', 'Calcium', 1), ('Customer 1', 'Vitamin A', 0), ('Customer 1', 'HPMR', 0), ('Customer 1', 'Protein', 1), ('Customer 1', 'B vitamins', 0)] 输出: [('Customer 2', 'Calcium', 0), ('Customer 2', 'Vitamin A', 0), ('Customer 2', 'HPMR', 0), ('Customer 2', 'Protein', 1), ('Customer 2', 'B vitamins', 1), ('Customer 1', 'Calcium', 1), ('Customer 1', 'Vitamin A', 0), ('Customer 1', 'HPMR', 0), ('Customer 1', 'Protein', 1), ('Customer 1', 'B vitamins', 0)]

Also what you are inserting are tuples to the list, not lists. 另外,您要插入的是列表的元组,而不是列表。

I too thought of a list comprehension like others: 我也像其他人一样想到了列表理解:

cust = {'Customer 1': {'Vitamin A': 0, 'Calcium': 1, 'Protein': 1, 'B vitamins': 0, 'HPMR': 0}, 'Customer 2': {'Vitamin A': 0, 'Calcium': 0, 'Protein': 1, 'B vitamins': 1, 'HPMR': 0}}
cust_flat = [ (k, k2, v2) for k2, v2 in v.iteritems() for k, v in cust.iteritems() ]

Result looks like: 结果看起来像:

[('Customer 2', 'Calcium', 1),
 ('Customer 1', 'Calcium', 1),
 ('Customer 2', 'Vitamin A', 0),
 ('Customer 1', 'Vitamin A', 0),
 ('Customer 2', 'HPMR', 0),
 ('Customer 1', 'HPMR', 0),
 ('Customer 2', 'Protein', 1),
 ('Customer 1', 'Protein', 1),
 ('Customer 2', 'B vitamins', 0),
 ('Customer 1', 'B vitamins', 0)]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM