2011-11-23 26 views
5

Tôi không tìm thấy cách nào tốt hơn để cụm từ câu hỏi này trong tiêu đề. Nếu bạn có thể, vui lòng chỉnh sửa.làm thế nào để có được tất cả các kết hợp có thể có của các mục từ danh sách 2 chiều trong python?

Tôi có một danh sách liệt kê như thế này:

a = [['a','b'],[1,2]] 

bây giờ, tôi muốn một chức năng mà spits ra tất cả các kết hợp có thể như thế này:

[['a',1],['a',2],['b',1],['b',2]] 

nơi cũng không phải là số lượng danh sách trong một được biết trước, cũng không phải là chiều dài của mỗi danh sách phụ được biết trước, nhưng tất cả các kết hợp xuất hiện phải chứa 1 mục từ mỗi danh sách con.

Trả lời

11

Bạn cần itertools.product():

>>> list(itertools.product(*a)) 
[('a', 1), ('a', 2), ('b', 1), ('b', 2)] 
+0

Đối với những ai đang tự hỏi, các * ở phía trước của một giải nén danh sách: http://stackoverflow.com/a/2921893/4549682 – wordsforthewise

0

Đây có thể là những gì itertools.product() (mà Sven đề cập) không:

def combs(list1, list2): 
    results = [] 
    for x in list1: 
     for y in list2: 
      l.append([x,y]) 
    return results 
+0

Điều đó sẽ làm việc nếu tôi luôn luôn chỉ có 2 danh sách phụ, như trong ví dụ '[[1,2], ['a', 'b']], và sau đó bạn chỉ cần chuyển hai danh sách phụ vào hàm này, nhưng đây không phải là trường hợp, danh sách cũng có thể là' [[ 'a', 'b', 'c'], [1,2], [{}, [],()]] ', vì vậy bây giờ chúng tôi có 3 danh sách con, vì vậy những gì chúng tôi cần là một chức năng mà bạn nhân số lượng danh sách thay đổi. – bigblind

+0

Ah, tôi giả định từ ví dụ của bạn nó sẽ luôn luôn là cặp. Tôi không có một gợi ý tốt hơn sau đó. – Anko

0

Đây là một giải pháp sử dụng đệ quy, combs_raccum tiêu hóa head (danh sách tiếp theo phù hợp) để tạo ra một fatter accum0, sau đó và tự gọi ("đệ quy") với tail (các danh sách còn lại) và số dư hiện đang tích lũy accum0.

Có thể là người dùng nhiều bộ nhớ khi mỗi cuộc gọi đến combs_r thêm một không gian tên mới, cho đến khi kết thúc khi tất cả thư giãn. Người biết nhiều hơn trong nội bộ Python có thể bình luận về điều này.

Trả tiền để học prolog, IMHO.

def combs(ll): 
    if len(ll) == 0: 
     return [] 
    if len(ll) == 1: 
     return [[item] for item in ll[0]] 
    elif len(ll) == 2: 
     return lmul(ll[0], [[item] for item in ll[1]]) 
    else: 
     return combs_r(ll[1:], ll[0]) 

def combs_r(ll, accum): 
    head = ll[0] 
    tail = ll[1:] 
    accum0 = [] 
    accum0 = lmul(head, accum) 
    if len(tail) == 0: 
     return accum0 
    else: 
     return combs_r(tail, accum0) 

def lmul(head, accum): 
    accum0 = [] 
    for ah in head: 
     for cc in accum: 
      #cc will be reused for each ah, so make a clone to mutate 
      cc0 = [x for x in cc] 
      cc0.append(ah) 
      accum0.append(cc0) 
    return accum0 

sampleip = [['a','b','c'],[1,2], ['A', 'B']] 
sampleip2 = [['a','b','c'],[1,2]] 
sampleip1 = [['a','b','c']] 
sampleip0 = [] 
print combs(sampleip0) 
print combs(sampleip1) 
print combs(sampleip2) 
print combs(sampleip) 
Các vấn đề liên quan