2016-10-21 27 views
3

我有我想要繪製隨機樣本的元組的collection.deque()。 在Python 2.7中,我可以使用batch = random.sample(my_deque, batch_size)如何從Python 3中的deque獲取random.sample()?

但是在Python 3.4這引起了TypeError: Population must be a sequence or set. For dicts, use list(d).

什麼是最好的解決辦法,或建議在Python 3從雙端隊列有效採樣方法是什麼?

+0

這有幫助嗎? http://stackoverflow.com/questions/2011583/display-random-choice-python –

+0

如果deque足夠短我只是'樣品(列表(the_deque),k)' – kennytm

+1

奇怪。 'random.sample(deq,size)'在Python 3.5上適用於我。確認不工作3.4 –

回答

5

顯而易見的方法 - 轉換爲列表。

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] 

P.S. (已編輯)

實際上,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] 

注意!正如Geoffrey Irving在下面的評論中正確地陳述的那樣,你最好將隊列轉換成一個列表,因爲隊列被實現爲鏈接列表,使得每個索引訪問O(n)的隊列大小,因此採樣m隨機值將需要O(m * n)時間。

+1

使用python運行證明3.4 http://bugs.python.org/issue23704 –

+0

@PadraicCunningham謝謝,更新。 –

+1

請注意,根據文檔,random.sample將是二次時間,因爲每個deque下標在中間是O(n)。 –