2013-03-04 42 views
7

Với một cuốn từ điển đó trông như thế này:Kết hợp Python điển hoán vị vào Danh sách Từ điển

{ 
    'Color': ['Red', 'Yellow'], 
    'Size': ['Small', 'Medium', 'Large'] 
} 

Làm thế nào tôi có thể tạo ra một danh sách các từ điển kết hợp các giá trị khác nhau của các phím từ điển đầu tiên không? Những gì tôi muốn là:

[ 
    {'Color': 'Red', 'Size': 'Small'}, 
    {'Color': 'Red', 'Size': 'Medium'}, 
    {'Color': 'Red', 'Size': 'Large'}, 
    {'Color': 'Yellow', 'Size': 'Small'}, 
    {'Color': 'Yellow', 'Size': 'Medium'}, 
    {'Color': 'Yellow', 'Size': 'Large'} 
] 
+0

Đây sẽ là một câu hỏi hay nếu bạn cho chúng tôi thấy những gì bạn đã thử. – msvalkon

+1

Tôi muốn nói đây là một câu hỏi hay trong mọi trường hợp vì không dễ để đưa ra khái niệm đúng ở đây. –

Trả lời

22

Tôi nghĩ rằng bạn muốn sản phẩm Descartes, không phải là một hoán vị, trong trường hợp này itertools.product có thể giúp:

>>> from itertools import product 
>>> d = {'Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']} 
>>> [dict(zip(d, v)) for v in product(*d.values())] 
[{'Color': 'Red', 'Size': 'Small'}, {'Color': 'Red', 'Size': 'Medium'}, {'Color': 'Red', 'Size': 'Large'}, {'Color': 'Yellow', 'Size': 'Small'}, {'Color': 'Yellow', 'Size': 'Medium'}, {'Color': 'Yellow', 'Size': 'Large'}] 
+1

+1. Điều cần biết là Python lặp qua các mục từ điển trong cùng một thứ tự tái tạo, cả hai cho 'zip()' và '.values ​​()'! –

+2

@TimPietzcker: có, thuộc tính này là [tài liệu] (http://docs.python.org/2/library/stdtypes.html#dict.items) và có thể dựa vào. Bản thân thứ tự là tùy ý, nhưng không triển khai Python tương thích nào có thể vi phạm bảo đảm rằng nếu bạn không sửa đổi 'd',' d.keys() '(ở đây' d') và 'd.values ​​()' phải khớp . – DSM

+0

Đây chính xác là những gì tôi muốn! Cảm ơn bạn. – user1272534

1

Bạn có thể lấy kết quả đó làm điều này:

x={'Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']} 
keys=x.keys() 
values=x.values() 

matrix=[] 
for i in range(len(keys)): 
    cur_list=[] 
    for j in range(len(values[i])): 
      cur_list.append({keys[i]: values[i][j]}) 
    matrix.append(cur_list) 

y=[] 
for i in matrix[0]: 
    for j in matrix[1]: 
      y.append(dict(i.items() + j.items())) 

print y 

kết quả:

[{'Color': 'Red', 'Size': 'Small'}, {'Color': 'Red', 'Size': 'Medium'}, {'Color': 'Red', 'Size': 'Large'}, {'Color': 'Yellow', 'Size': 'Small'}, {'Color': 'Yellow', 'Size': 'Medium'}, {'Color': 'Yellow', 'Size': 'Large'}] 
Các vấn đề liên quan