2010-05-17 69 views
31

Trong Python, tôi có một danh sách gồm n danh sách, mỗi danh sách có một số yếu tố. Làm thế nào tôi có thể tạo ra một danh sách duy nhất chứa tất cả các hoán vị có thể:Tất cả các hoán vị có thể có của một tập hợp các danh sách trong Python

Ví dụ

[ [ a, b, c], [d], [e, f] ] 

Tôi muốn

[ [a, d, e] , [a, d, f], [b, d, e], [b, d, f], [c, d, e], [c, d, f] ] 

Lưu ý tôi không biết n trước. Tôi nghĩ itertools.product sẽ là phương pháp đúng, nhưng nó đòi hỏi tôi để biết số lượng các đối số trước

+0

Tôi không hiểu - tại sao bạn không tính danh sách để tìm n? –

+1

Tôi có thể làm điều đó, nó giúp tôi như thế nào? – rauyran

Trả lời

56

Bạn không cần biết n trước để sử dụng itertools.product

>>> import itertools 
>>> s=[ [ 'a', 'b', 'c'], ['d'], ['e', 'f'] ] 
>>> list(itertools.product(*s)) 
[('a', 'd', 'e'), ('a', 'd', 'f'), ('b', 'd', 'e'), ('b', 'd', 'f'), ('c', 'd', 'e'), ('c', 'd', 'f')] 
+0

Yep - các danh sách đối số trong Python có thể khá tiện dụng. – Amber

+0

(Để biết thêm thông tin về danh sách đối số: http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists) – Amber

+0

Tuyệt vời. Tôi đã bỏ lỡ cách sử dụng danh sách đối số đúng cách. – rauyran

2

Bạn có thể làm điều đó với một danh sách đa cấp hiểu:

>>> L1=['a','b','c'] 
>>> L2=['d'] 
>>> L3=['e','f'] 
>>> [[i,j,k] for i in L1 for j in L2 for k in L3] 
[['a', 'd', 'e'], ['a', 'd', 'f'], ['b', 'd', 'e'], ['b', 'd', 'f'], ['c', 'd', 'e'], ['c', 'd', 'f']] 
+2

Điều này yêu cầu bạn phải biết trước số 'n' (' n = 3' trong câu trả lời của bạn) :) – badp

+0

Cảm ơn, nhưng tôi không biết số lượng danh sách trước. Tôi có tương đương với [L1, L2, L3, ...] – rauyran

+0

Ah okay tôi không rõ ràng về những gì bạn có nghĩa là "biết số lượng các đối số trước" - Tôi nghĩ bạn có thể có nghĩa là độ dài của danh sách –

4

itertools.product làm việc cho tôi.

>>> l=[ [ 1, 2, 3], [4], [5, 6] ] 
>>> list(itertools.product(*l)) 
[(1, 4, 5), (1, 4, 6), (2, 4, 5), (2, 4, 6), (3, 4, 5), (3, 4, 6)] 
>>> l=[ [ 1, 2, 3], [4], [5, 6],[7,8] ] 
>>> list(itertools.product(*l)) 
[(1, 4, 5, 7), (1, 4, 5, 8), (1, 4, 6, 7), (1, 4, 6, 8), (2, 4, 5, 7), (2, 4, 5, 8), (2, 4, 6, 7), (2, 4, 6, 8), (3, 4, 5, 7), (3, 4, 5, 8), (3, 4, 6, 
7), (3, 4, 6, 8)] 
>>> 
Các vấn đề liên quan