2013-02-07 5 views
0

J'ai un dictionnaire de dictionnaires et j'ai besoin de l'aplatir en une liste. Mon but ici est de l'avoir sous une forme que je peux envoyer à une base de données MySQL. Le dictionnaire est sous formeaplatir un dictionnaire de dictionnaires dans une liste en python

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

Je veux qu'il finisse comme:

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

Merci pour votre aide

Répondre

0
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 

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

aussi ce que vous insérez sont tuples à la liste, pas de listes.

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

ou en utilisant 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)] 
0
[(k, k2, v) for k in dct for k2, v in k.items()] 
0

moi aussi pensé à une compréhension de liste comme les autres:

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

résultat ressemble à:

[('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)] 
Questions connexes