关于列表:显示随机选择(Python)

Display random choice (Python)

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

  • list1=第1项,第2项,第3项,第4项,第5项,第6项,第7项,第8项,第9项,第10项
  • 显示随机选择从上面的列表中
  • list2=将最后显示的项目存储在list2中,该列表只应存储7项目,而不是更多
  • 随机显示从列表中选择但使当然不存在于表2
  • 这是正确的方法吗?不管怎样,我想知道如何限制一个列表只存储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]

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


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

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