Câu hỏi Cặp chéo sản phẩm trong Python [trùng lặp]


Câu hỏi này đã có câu trả lời ở đây:

Làm cách nào tôi có thể nhận danh sách sản phẩm chéo cặp từ danh sách các danh sách dài tùy ý bằng Python?

Thí dụ

a = [1, 2, 3]
b = [4, 5, 6]

crossproduct(a,b) nên năng suất [[1, 4], [1, 5], [1, 6], ...].


76
2018-03-29 21:27


gốc


Nó được gọi là sản phẩm Descartes. - jfs
còn được gọi là sản phẩm chéo en.wikipedia.org/wiki/Cross_product_(disambiguation) - sam boosalis


Các câu trả lời:


Bạn đang tìm itertools.product nếu bạn đang ở trên (ít nhất) Python 2.6.

>>> import itertools
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> itertools.product(a,b)
<itertools.product object at 0x10049b870>
>>> list(itertools.product(a,b))
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

113
2018-03-29 21:29



Lưu ý rằng để sử dụng trước phiên bản 2.6, bạn có thể chỉ cần sao chép và dán bản triển khai Python tinh khiết từ tài liệu được liên kết. - Mike Graham
product() không bị giới hạn bởi hai tham số do đó có thể sử dụng cho một số lượng tùy ý các danh sách (tự liệt kê). Vì vậy, bạn có thể làm list(itertools.product(*[[1,2],[3,4],[5,6]])) để có được [(1, 3, 5), (1, 3, 6),.. - valid


Vì bạn đã yêu cầu danh sách:

[(x, y) for x in a for y in b]

Nhưng bạn có thể tránh chi phí của một danh sách nếu bạn chỉ lặp qua các danh sách này bằng cách sử dụng các trình tạo thay thế:

((x, y) for x in a for y in b)

Hoạt động giống hệt nhau trong một for nhưng không dẫn đến việc tạo list.


74
2018-03-29 21:30



Tôi thích phương pháp này, nhưng không thể nói tại sao. Có thể vì vòng lặp kép rõ ràng? - Rich
Độc đáo pythonic. Hoặc như tôi muốn nói, một ví dụ điển hình về sự nhạy bén. - charleslparker
Cảm ơn! Tôi là một fan hâm mộ lớn của mã trông giống như những gì nó làm. - Cory Petosky
Tôi không chắc chắn chính xác những gì bạn muốn nói. Nếu a và b không phải là tập hợp và có các phần tử trùng lặp trong chính chúng, sau đó có, điều này có thể tạo các mục trùng lặp. [(x, y) for x in [1, 1] for y in [2]] sẽ sản xuất [(1, 2), (1, 2)]. Nhưng đó là kết quả của việc áp dụng một phép toán được xác định trên các bộ trên đầu vào không được đặt. Cặp đảo ngược sẽ không xảy ra - bất kỳ thứ gì trong a có thể lặp lại sẽ không bao giờ xuất hiện dưới dạng phần tử thứ hai của một cặp được trả về trừ khi phần tử đó cũng nằm trong b có thể lặp lại. - Cory Petosky
Rõ ràng luôn tốt hơn là ngầm. - ozgur


Sử dụng trình tạo không cần itertools, chỉ cần:

gen = ((x, y) for x in a for y in b)

for u, v in gen:
    print u, v

12
2017-11-07 09:39