Python 里如何随机从队列里取一个对象?

2015-01-31 18:39:16 +08:00
 a2z
from Queue import Queue


q=Queue()
for i in xrange(10000):
q.put(i)



print q.get()
4832 次点击
所在节点    Python
22 条回复
jyjmrlk
2015-01-31 18:46:35 +08:00
import random

print random.choice(range(10000))

不知道这个符不符合你的要求。
icedx
2015-01-31 18:47:19 +08:00
import random
a=random.randrange(0,8)
a2z
2015-01-31 18:50:54 +08:00
不是取随机数是从queue里面随机get一个对象
aaaa007cn
2015-01-31 19:09:03 +08:00
做不到
queue 只能顺序存取
https://docs.python.org/2/library/queue.html
FIFO queue
LIFO queue
priority queue
a2z
2015-01-31 19:28:50 +08:00
@aaaa007cn

搞定了= =
似乎还行,感觉有点hacky
aec4d
2015-01-31 19:45:07 +08:00
@a2z 直接重写_get方法比较好看
kofj
2015-01-31 20:36:38 +08:00
不会Python,疑惑的是,既然需要做随机读取,那楼主为什么非要把数据存入线性表而非set呢?
a2z
2015-01-31 21:15:50 +08:00
@kofj

因为有时候要随机读取有时候要顺序读取。在python里面queue是deque,读取写入都很快,set的话数据量一大就极慢
ruoyu0088
2015-01-31 21:20:48 +08:00
“因为有时候要随机读取有时候要顺序读取”,你rotate之后还要不要顺序读取?
ggarlic
2015-01-31 21:21:34 +08:00
@a2z 如果要照你这个回复的话,你上面的代码可能有点问题。你rotate之后顺序都变了
ruoyu0088
2015-01-31 21:23:36 +08:00
9hills
2015-01-31 21:31:02 +08:00
看了附言,lz真是思路广

话说你random get后,queue你不rotate回去么。。
a2z
2015-01-31 21:50:01 +08:00
@9hills
@ruoyu0088

不是随机读之后再顺序读,是类似一个选项

if xxx:
q.get()
else:
q.randget()
a2z
2015-01-31 21:51:36 +08:00
@livid

麻烦解决下空格和tab的缩进问题……
now i hate python
ruoyu0088
2015-01-31 21:52:38 +08:00
@a2z 那下次xxx条件不会变?就是说某一次xxx为True->q.get(), 某一次xxx为False->q.randget()?
a2z
2015-01-31 21:54:39 +08:00
@ruoyu0088

不会,是用optparse指定的,程序运行的时候不会改。
ryd994
2015-01-31 22:25:41 +08:00
deque是用heap实现的
deque的rotate我记得是log复杂度
那就问题不大
ggarlic
2015-01-31 23:06:39 +08:00
ryd994
2015-01-31 23:11:10 +08:00
@ggarlic 那rotation的效率岂不是线性!
a2z
2015-02-01 10:33:18 +08:00
@ryd994
O(k)

K是rotate的个数,随机的0-n

这么一想好像有点慢了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/167088

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX