Display random choice (Python)
我有一个项目列表[],我想从中随机显示一个项目,但在最后X个请求中,显示的项目不能重复一次以上。
这是正确的方法吗?不管怎样,我想知道如何限制一个列表只存储7个项目?
谢谢
collections.deque是python中唯一自然支持绑定的序列类型(并且仅在python 2.6及更高版本中),如果使用python 2.6或更高版本:
1 2 3 4 5 6 7 8 | # Setup from collections import deque from random import choice used = deque(maxlen=7) # Now your sampling bit item = random.choice([x for x in list1 if x not in used]) used.append(item) |
号
如果使用的是python 2.5或更低版本,则不能使用maxlen参数,需要再执行一个操作来切掉deque前面的部分:
1 2 | while len(used) > 7: used.popleft() |
这并不是最有效的方法,但确实有效。如果您需要速度,并且您的对象是可散列的(最不可变的类型),请考虑使用字典作为"已用"列表。
另外,如果只需要执行一次,random.shuffle方法也可以工作。
这就是你想要的吗?
1 2 3 4 5 6 7 | list1 = range(10) import random random.shuffle(list1) list2 = list1[:7] for item in list2: print item print list1[7] |
换句话说,看看
您可以尝试使用生成器函数,并在需要新项目时调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import random def randomizer(l, x): penalty_box = [] random.shuffle(l) while True: element = l.pop(0) # for show print penalty_box, l yield element penalty_box.append(element) if len(penalty_box) > x: # penalty time over for the first element in the box # reinsert randomly into the list element = penalty_box.pop(0) i = random.randint(0, len(l)) l.insert(i, element) |
用法示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | >>> r = randomizer([1,2, 3, 4, 5, 6, 7, 8], 3) >>> r.next() [] [1, 5, 2, 6, 4, 8, 7] 3 >>> r.next() [3] [5, 2, 6, 4, 8, 7] 1 >>> r.next() [3, 1] [2, 6, 4, 8, 7] 5 >>> r.next() [3, 1, 5] [6, 4, 8, 7] 2 >>> r.next() [1, 5, 2] [4, 3, 8, 7] 6 >>> r.next() [5, 2, 6] [4, 3, 8, 7] 1 >>> r.next() [2, 6, 1] [5, 3, 8, 7] 4 >>> r.next() [6, 1, 4] [3, 8, 2, 7] 5 |
。
我将使用set objects获取列表1中而不是列表2中的项目列表:
1 2 3 4 5 6 7 8 9 10 11 | import random list1 = set(["item1","item2","item3","item4","item5", "item6","item7","item8","item9","item10"]) list2 = [] while True: # Or something selection = random.choice(tuple(list1.difference(set(list2)))) print(selection) list2.append(selection) if len(list2) > 7: list2 = list2[-7:] |
。
比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Setup import random list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] list2 = [] # Loop for as long as you want to display items while loopCondition: index = random.randint(0, len(list1)-1) item = list1.pop(index) print item list2.append(item) if(len(list2) > 7): list1.append(list2.pop(0)) |
。