显示随机选择(Python)

时间:2010-01-06 07:59:31

标签: python list random limit

我有一个列表[]项目,我想从中随机显示一个项目,但显示的项目在最后的x个请求中不得重复多次。

  1. list1 = item1,item2,item3,item4, item5,item6,item7,item8,item9, 第10项
  2. 显示随机选择 从上面的列表
  3. list2 =存储list2中最后显示的项目,该项目只应存储7 项目,而不是更多
  4. 随机显示 从列表中选择但是制作 确定它不存在于 list2中
  5. 这是正确的方法吗?无论哪种方式,我想知道如何限制列表只存储7项?

    由于

5 个答案:

答案 0 :(得分:7)

collections.deque是python中唯一自然支持有界的序列类型(仅在Python 2.6及更高版本中使用。)如果使用python 2.6或更新:

# 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参数,并且需要再执行一次操作来切断双端队列的前端:

while len(used) > 7:
    used.popleft()

这不是最有效的方法,但它有效。如果您需要速度,并且您的对象是可清除的(大多数不可变类型),请考虑使用字典作为“已使用”列表。

此外,如果您只需要执行一次,则random.shuffle方法也可以。

答案 1 :(得分:4)

这是你想要的吗?

list1 = range(10)
import random
random.shuffle(list1)
list2 = list1[:7]
for item in list2:
    print item
print list1[7]

换句话说,请看random.shuffle()。如果要保持原始列表不变,可以复制它:list_copy = list1[:]

答案 2 :(得分:2)

您可以尝试使用生成器功能,并在需要新项目时调用.next()

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)

用法示例:

>>> 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

答案 3 :(得分:1)

类似的东西:

# 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))

答案 4 :(得分:1)

我使用set对象来获取list1中的项目列表但不在list2中:

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:]