Как получить 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) времени.