Вы ищете декартово произведение .
В математике декартово произведение (или набор продуктов) - это прямое произведение двух наборов.
В вашем случае это будет {1, 2, 3, 4, 5, 6}
x {1, 2, 3, 4, 5, 6}
.
itertools
могу помочь вам в этом:
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)]
Чтобы получить случайный бросок кубиков ( совершенно неэффективным способом ):
import random
random.choice([p for p in itertools.product(x, repeat=2)])
(6, 3)
random.randint
бы проще и эффективнее.Вы не ищете перестановок - вам нужно декартово произведение . Для этого используйте продукт от itertools:
from itertools import product for roll in product([1, 2, 3, 4, 5, 6], repeat = 2): print(roll)
источник
В python 2.7 и 3.1 есть
itertools.combinations_with_replacement
функция:>>> list(itertools.combinations_with_replacement([1, 2, 3, 4, 5, 6], 2)) [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6), (5, 5), (5, 6), (6, 6)]
источник
(2, 1)
,(3, 2)
,(3, 1)
и подобное ... В целом она выходит из всех комбинаций , где второй рулон ниже , чем первый.В этом случае понимание списка особо не требуется.
Дано
import itertools as it seq = range(1, 7) r = 2
Код
list(it.product(seq, repeat=r))
Детали
Очевидно, что декартово произведение может порождать подмножества перестановок. Однако из этого следует, что:
product
Перестановки с заменой, n r
[x for x in it.product(seq, repeat=r)]
Перестановок без замены, п!
[x for x in it.product(seq, repeat=r) if len(set(x)) == r]
# Equivalent list(it.permutations(seq, r))
Следовательно, все комбинаторные функции могут быть реализованы из
product
:combinations_with_replacement
реализовано изproduct
combinations
реализовано изpermutations
, которое может быть реализовано с помощьюproduct
(см. выше)источник
Думаю, я нашел решение, используя только
lambdas
,map
иreduce
.product_function = lambda n: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(n)), [])
По сути, я сопоставляю первую лямбда-функцию, которая дает строку, выполняет итерацию столбцов
list(map(lambda j: (i, j), np.arange(n)))
затем это используется как результат новой лямбда-функции
lambda i:list(map(lambda j: (i, j), np.arange(n)))
который отображается во всех возможных строках
map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(m))
а затем сводим все получившиеся списки в один.
даже лучше
Также можно использовать два разных числа.
prod= lambda n, m: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(m))), np.arange(n)), [])
источник
Во-первых, вам нужно сначала превратить генератор, возвращаемый itertools.permutations (list), в список. Затем, во-вторых, вы можете использовать set () для удаления дубликатов, как показано ниже:
def permutate(a_list): import itertools return set(list(itertools.permutations(a_list)))
источник