Как получить random.пример () из deque в Python 3?
у меня есть в коллекции.deque() кортежей, из которых я хочу рисовать случайные выборки.
В Python 2.7, я могу использовать batch = random.sample(my_deque, batch_size)
.
но в Python 3.4 это поднимает TypeError: Population must be a sequence or set. For dicts, use list(d).
каков наилучший обходной путь или рекомендуемый способ эффективной выборки из deque в Python 3?
1 ответов
очевидный способ – преобразовать в список.
batch = random.sample(list(my_deque), batch_size))
но вы можете избежать создания всего списка.
idx_batch = set(sample(range(len(my_deque)), batch_size))
batch = [val for i, val in enumerate(my_deque) if i in idx_batch]
С. П. (Ред.)
на самом деле random.sample
должно работать нормально с двусторонней очередью в Python >= 3.5. потому что класс был обновлен, чтобы соответствовать интерфейсу последовательности.
In [3]: deq = collections.deque(range(100))
In [4]: random.sample(deq, 10)
Out[4]: [12, 64, 84, 77, 99, 69, 1, 93, 82, 35]
внимание! Как правильно заявил Джеффри Ирвинг в комментарии ниже, вам лучше преобразовать очередь в список, потому что очереди реализуются как связанные списки, создание каждого индекса-доступа O(n) в размере очереди, поэтому выборка M случайных значений займет O (m*n) времени.