繁体   English   中英

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

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

我有一本字典的字典,需要将其放到列表中。 我的目标是以一种可以发送到MySQL数据库的形式进行存储。 字典的形式

{
 '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}
 }

我希望它最终像:

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

谢谢你的帮助

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)]

或使用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

输出: [('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)]

另外,您要插入的是列表的元组,而不是列表。

我也像其他人一样想到了列表理解:

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() ]

结果看起来像:

[('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