Bạn đang tìm kiếm sản phẩm Cartesian.
Trong toán học, một sản phẩm Cartesian [hoặc bộ sản phẩm] là sản phẩm trực tiếp của hai bộ.
Trong trường hợp của bạn, đây sẽ là {1, 2, 3, 4, 5, 6}
x {1, 2, 3, 4, 5, 6}
. itertools
có thể giúp bạn ở đó:
import itertools
x = [1, 2, 3, 4, 5, 6]
[p for p in itertools.product[x, repeat=2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3],
[2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6],
[4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3],
[5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]]
Để có được một cuộn xúc xắc ngẫu nhiên [theo một cách hoàn toàn không hiệu quả]:totally inefficient way]:
import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
.
Nếu bạn là một danh sách, từ điển hoặc đối tượng có thể lặp lại khác của các giá trị mà bạn cần để tạo các kết hợp và hoán vị từ, Python có mô-đun itertools
tích hợp như một phần của thư viện tiêu chuẩn của nó. Các hoán vị của một thứ khác là mọi thứ tự có thể có của tất cả các giá trị, trong khi các kết hợp là mọi lựa chọn có thể có của một số, không có hoặc tất cả các giá trị. Ví dụ: các hoán vị và kết hợp của tập hợp
import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
1 là:ordering of
all of the values, while the combinations are every possible selection of some, none, or all of the values. For example, the permutations and combinations of the set import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
1 are:
ABC, ACB, BAC, BCA, Cab | [Không có], A, B, C, AB, AC, BC, ABC |
Bạn cũng có thể sử dụng lại các giá trị nhiều lần, được gọi là hoán vị với sự lặp lại và kết hợp với sự lặp lại [còn được gọi là thay thế]:
AAA, AAB, AAC, ABA, ABB, ABC, ACA, ACB, ACC, BAA, BAB, BAC, BBA, BBB, BBC, BCA, BCB, BCC, CAA, CAB, CAC, CBA, CBB, CBC, CBC, CCA, CCB, CCC | [Không có], a, b, c, aa, ab, ac, bb, bc, cc, aaa, aab, aac, abb, abc, acc |
.
Số lượng hoán vị và kết hợp nhanh chóng tăng lên khi nhiều giá trị được thêm vào đối tượng có thể lặp lại. Tổng số hoán vị và kết hợp được đưa ra sau:
Hoán vị của n giá trị | Kết hợp các giá trị n | |
Mà không có sự lặp lại | N! | 2^n |
Với sự lặp lại | n^n | "2n chọn n", nghĩa là, [2n]! / [n!]^2 |
Nhưng để có Python tạo hoán vị, bạn có thể sử dụng
import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
2:>>> import itertools >>> for v in itertools.permutations[['A', 'B', 'C']]: ... print[v] ... ['A', 'B', 'C'] ['A', 'C', 'B'] ['B', 'A', 'C'] ['B', 'C', 'A'] ['C', 'A', 'B'] ['C', 'B', 'A'] >>> >>> list[itertools.permutations[['A', 'B', 'C']]] [['A', 'B', 'C'], ['A', 'C', 'B'], ['B', 'A', 'C'], ['B', 'C', 'A'], ['C', 'A', 'B'], ['C', 'B', 'A']] >>> list[itertools.permutations[['A', 'B', 'C'], 2]] [['A', 'B'], ['A', 'C'], ['B', 'A'], ['B', 'C'], ['C', 'A'], ['C', 'B']] >>> list[itertools.permutations[['A', 'B', 'C'], 1]] [['A',], ['B',], ['C',]]
Để có các kết hợp tạo python, bạn có thể sử dụng
import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
3:>>> import itertools >>> for v in itertools.combinations[['A', 'B', 'C'], 2]: ... print[v] ... ['A', 'B'] ['A', 'C'] ['B', 'C'] >>> list[itertools.combinations[['A', 'B', 'C'], 1]] [['A',], ['B',], ['C',]] >>> list[itertools.combinations[['A', 'B', 'C'], 2]] [['A', 'B'], ['A', 'C'], ['B', 'C']] >>> list[itertools.combinations[['A', 'B', 'C'], 3]] [['A', 'B', 'C']]
Lưu ý rằng hàm
import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
4 lấy đối số thứ hai cho số lượng giá trị được chọn.Để có được tất cả các kết hợp [còn được gọi là bộ sức mạnh], bạn sẽ cần thực hiện nhiều cuộc gọi đến import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
4:all combinations [also called the power set], you'll need to make multiple calls to import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
4:>>> powerSet = [] >>> import itertools >>> for k in range[4]: ... powerSet.extend[itertools.combinations[['A', 'B', 'C'], k]] ... >>> powerSet [[], ['A',], ['B',], ['C',], ['A', 'B'], ['A', 'C'], ['B', 'C'], ['A', 'B', 'C']]
Để có được hoán vị với sự lặp lại/thay thế, hãy gọi
import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
6 và vượt qua kích thước của đối tượng có thể lặp lại cho đối số import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
7 của nó:>>> import itertools >>> for v in itertools.product[['A', 'B', 'C'], repeat=3]: ... print[v] ... ['A', 'A', 'A'] ['A', 'A', 'B'] ['A', 'A', 'C'] ['A', 'B', 'A'] ['A', 'B', 'B'] ['A', 'B', 'C'] ['A', 'C', 'A'] ['A', 'C', 'B'] ['A', 'C', 'C'] ['B', 'A', 'A'] ['B', 'A', 'B'] ['B', 'A', 'C'] ['B', 'B', 'A'] ['B', 'B', 'B'] ['B', 'B', 'C'] ['B', 'C', 'A'] ['B', 'C', 'B'] ['B', 'C', 'C'] ['C', 'A', 'A'] ['C', 'A', 'B'] ['C', 'A', 'C'] ['C', 'B', 'A'] ['C', 'B', 'B'] ['C', 'B', 'C'] ['C', 'C', 'A'] ['C', 'C', 'B'] ['C', 'C', 'C'] >>> list[itertools.product[['A', 'B', 'C'], repeat=3]] [['A', 'A', 'A'], ['A', 'A', 'B'], ['A', 'A', 'C'], ['A', 'B', 'A'], ['A', 'B', 'B'], ['A', 'B', 'C'], ['A', 'C', 'A'], ['A', 'C', 'B'], ['A', 'C', 'C'], ['B', 'A', 'A'], ['B', 'A', 'B'], ['B', 'A', 'C'], ['B', 'B', 'A'], ['B', 'B', 'B'], ['B', 'B', 'C'], ['B', 'C', 'A'], ['B', 'C', 'B'], ['B', 'C', 'C'], ['C', 'A', 'A'], ['C', 'A', 'B'], ['C', 'A', 'C'], ['C', 'B', 'A'], ['C', 'B', 'B'], ['C', 'B', 'C'], ['C', 'C', 'A'], ['C', 'C', 'B'], ['C', 'C', 'C']]
Để có được sự kết hợp với sự lặp lại/thay thế, hãy gọi
import random
random.choice[[p for p in itertools.product[x, repeat=2]]]
[6, 3]
8:>>> import itertools >>> for v in itertools.combinations_with_replacement[['A', 'B', 'C'], 3]: ... print[v] ... ['A', 'A', 'A'] ['A', 'A', 'B'] ['A', 'A', 'C'] ['A', 'B', 'B'] ['A', 'B', 'C'] ['A', 'C', 'C'] ['B', 'B', 'B'] ['B', 'B', 'C'] ['B', 'C', 'C'] ['C', 'C', 'C'] >>> list[itertools.combinations_with_replacement[['A', 'B', 'C'], 3]] [['A', 'A', 'A'], ['A', 'A', 'B'], ['A', 'A', 'C'], ['A', 'B', 'B'], ['A', 'B', 'C'], ['A', 'C', 'C'], ['B', 'B', 'B'], ['B', 'B', 'C'], ['B', 'C', 'C'], ['C', 'C', 'C']]
Nếu bạn giống như tôi và bạn gặp khó khăn khi nhớ sự khác biệt giữa hoán vị và kết hợp, có và không có sự lặp lại, và các chức năng Python nào thực hiện chúng, hãy đánh dấu trang này để có quyền truy cập dễ dàng trong tương lai.