2015-05-18 45 views
5

Trước hết tôi muốn nói rằng tiêu đề của tôi có lẽ không mô tả chính xác câu hỏi của tôi. Tôi không biết làm thế nào quá trình tôi đang cố gắng để thực hiện được gọi là, mà làm cho tìm kiếm một giải pháp trên stackoverflow hoặc google rất khó khăn. Một gợi ý liên quan đến điều này có thể đã giúp tôi rất nhiều!Python: Kết hợp trong danh sách các danh sách (?)

Điều tôi hiện có về cơ bản là hai danh sách có danh sách dưới dạng phần tử. Ví dụ:

List1 = [ [a,b], [c,d,e], [f] ] 
List2 = [ [g,h,i], [j], [k,l] ] 

Những danh sách này về cơ bản đỉnh của một đồ thị tôi đang cố gắng để tạo ra sau này trong dự án của tôi, nơi mà các cạnh có nghĩa vụ phải được từ List1 để List2 bởi hàng.

Nếu chúng ta nhìn vào hàng đầu tiên của mỗi người trong danh sách, tôi do đó có:

[a,b] -> [g,h,i] 

Tuy nhiên, tôi muốn có assingments/cạnh các yếu tố độc đáo, vì vậy tôi cần:

[a] -> [g] 
[a] -> [h] 
[a] -> [i] 
[b] -> [g] 
[b] -> [h] 
[b] -> [i] 

kết quả tôi muốn có là một danh sách khác, với những assigments độc đáo như các yếu tố, ví dụ:

List3 = [ [a,g], [a,h], [a,i], [b,g], ...] 

Có cách nào thanh lịch để có được từ List1 và List2 vào Danh sách 3 không? Cách tôi muốn thực hiện điều đó là bằng cách đi từng hàng, xác định số lượng thành phần của mỗi hàng và sau đó viết mệnh đề và vòng lặp để tạo danh sách mới với tất cả các kết hợp có thể. Điều này, tuy nhiên, cảm thấy như một cách rất không hiệu quả để làm điều đó.

+0

Dường như bạn muốn 'itertools. product' của mỗi cặp được tạo bởi 'zip'ping (hoặc' itertools.izip'ping in 2.x) hai danh sách cùng nhau. – jonrsharpe

+0

@jonrsharpe đánh tôi với nó, nhưng tôi đồng ý, đây là một công việc cho itertools (https://docs.python.org/2/library/itertools.html) – firelynx

+0

Cảm ơn bạn đã bình luận của bạn, tôi nghĩ rằng đây là chính xác những gì Tôi đang tìm kiếm! Tôi đang thử giải pháp được Cyber ​​nêu bên dưới bây giờ. – user4911943

Trả lời

13

Bạn có thể zip hai danh sách của mình, sau đó sử dụng itertools.product để tạo từng kết hợp của bạn. Bạn có thể sử dụng itertools.chain.from_iterable để làm phẳng danh sách kết quả.

>>> import itertools 
>>> List1 = [ ['a','b'], ['c','d','e'], ['f'] ] 
>>> List2 = [ ['g','h','i'], ['j'], ['k','l'] ] 
>>> list(itertools.chain.from_iterable(itertools.product(a,b) for a,b in zip(List1, List2))) 
[('a', 'g'), ('a', 'h'), ('a', 'i'), ('b', 'g'), ('b', 'h'), ('b', 'i'), ('c', 'j'), ('d', 'j'), ('e', 'j'), ('f', 'k'), ('f', 'l')] 
+0

vì bạn đang sử dụng itertools, bạn cũng có thể chuỗi –

+1

oh yeah :) bắt tốt – CoryKramer

+1

'chain.from_iterable' có thể được sử dụng để làm phẳng danh sách. Tất nhiên bạn có thể cần thêm một cuộc gọi 'list()' nếu máy phát không đủ. – Matthias

0
import itertools 
k = [] 
for a,b in zip(List1,List2): 
    for j in itertools.product(a,b): 
     k.append(j) 
print k 
+0

Một số điểm tương tự với giải pháp trên mà không sử dụng itertools.chain() – rajeshv90

2

Nếu bạn không muốn sử dụng itertools, bạn cũng có thể sử dụng list comprehensions kết hợp với zip để làm điều này khá thanh lịch:

lst1 = [['a','b'], ['c','d','e'], ['f']] 
lst2 = [['g','h','i'], ['j'], ['k','l']] 
edges = [[x, y] for il1, il2 in zip(lst1, lst2) for x in il1 for y in il2] 
Các vấn đề liên quan