0

我有一本字典,需要将其展平成一个列表。我的目标是把它做成可以发送到 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)`

谢谢你的帮助

4

5 回答 5

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)]]
于 2013-02-07T00:46:27.803 回答
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)]

或使用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)]
于 2013-02-07T00:46:55.093 回答
0
[(k, k2, v) for k in dct for k2, v in k.items()]
于 2013-02-07T00:49:11.440 回答
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

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

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

于 2013-02-07T00:50:56.173 回答
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)]
于 2013-02-07T00:53:04.833 回答