Вы можете реализовать рецепт random_product
itertools. Я буду использовать стороннюю библиотеку, more_itertools
, которая реализует этот рецепт для нас. Установите эту библиотеку через pip install more_itertools
.
Код
import more_itertool as mit
x, y, m = "abcdefgh", range(10), 2
iterable = mit.random_product(x, y, repeat=m)
Результаты
iterable
# ('e', 9, 'f', 3)
Не ясно, в какой форме OP хочет результатов, но вы можете сгруппировать x
и y
вместе, например, [(x[0], y[0]), (x[1], y[1]), ...]
:
paired_xy = list(zip(*[iter(iterable)]*2))
paired_xy
# [('e', 9), ('f', 3)]
Смотрите также more_itertools.sliced
и more_itertools.grouper
для группировки последовательных элементов.
Кроме того, вы можете zip
далее по группе x
и y
, например. [(x[0], x[1], ...), (y[0], y[1], ...)]
:
paired_xx = list(zip(*paired_xy))
paired_xx
# [('e', 'f'), (9, 3)]
Обратите внимание, этот подход принимает любое количество итерируемыми, x
, y
, z
и т.д.
# Select m random items from multiples iterables, REF 101
x, y, m = "abcdefgh", range(10), 2
a, b, c = "ABCDE", range(10, 100, 10), [False, True]
iterable = mit.random_product(x, y, a, b, c, repeat=m)
iterable
# ('d', 6, 'E', 80, True, 'a', 1, 'D', 50, False)
Детали
Из itertools recipes:
def random_product(*args, repeat=1):
"Random selection from itertools.product(*args, **kwds)"
pools = [tuple(pool) for pool in args] * repeat
return tuple(random.choice(pool) for pool in pools)
Мы можем видеть, что функция действительно принимает несколько аргументов, каждая из которых становится коллекцией пулов. Размер пула масштабируется на значение repeat
ключевое слово. Случайный выбор производится из каждого пула и объединяется в качестве конечного результата.
См. Также more_itertools
docs для получения дополнительных инструментов.
Вы посмотрели ['random.sample'] (https://docs.python.org/2/library/random.html#random.sample)? – metatoaster
@metatoaster В качестве замены команды shuffle? Все решение будет по-прежнему немного клочья. Если 'random.sample' может принимать два парных списка в качестве входных данных. –