【问题标题】:Python - Choose random name from array without repetition until all have been chosenPython - 从数组中选择随机名称而不重复,直到全部选择
【发布时间】:2019-07-09 16:11:50
【问题描述】:

我刚开始学习 Python,所以如果这很简单,我很抱歉。我想从一组名称中生成一个随机名称,然后在选择所有名称并重新开始之前不再重复该名称。下面的代码是我已经拥有的,这会生成随机名称,但会发生重复。

import random

employee = ["adam", "Scott", "Michael", "Andrew", "Mark", "Fernando", "Faith", "Steve", "Lee", "Amani", "Liv", "Nick A", "James", "Jake", "Brett", "Graham", "Fraser", "Jacob", "Chelsea", "Phil", "George", "Charley", "Emma", "Steph"]
print(random.choice(employee))

【问题讨论】:

  • 你为什么不直接使用random.shuffle(employee)然后迭代结果呢?

标签: python arrays random repeat


【解决方案1】:

您应该使用random.shuffle() 来打乱列表中的元素:

import random

employee = ["adam", "Scott", "Michael", "Andrew", "Mark", "Fernando", "Faith", "Steve", "Lee", "Amani", "Liv", "Nick A", "James", "Jake", "Brett", "Graham", "Fraser", "Jacob", "Chelsea", "Phil", "George", "Charley", "Emma", "Steph"]
random.shuffle(employee)
for i in employee:
    print(i)

您可以使用random.shuffle() 来随机化列表的顺序,并根据需要再次遍历列表。

【讨论】:

  • 嗨,这是对列表进行洗牌并显示整个列表,我想一次显示一个列表项。
  • @BrennanJenkins 你是什么意思?这将一个一个地打印每个元素,而不是一次打印整个列表。 for 循环遍历列表中的每个元素,存储在 i 中。
  • 抱歉,您是对的!在接下来的步骤之前,这已经完成了我所需要的。谢谢:)
  • @BrennanJenkins 好消息!祝你的程序好运:)
【解决方案2】:

两件事情中的一件应该工作,非常相似:

(1) 制作列表的副本;从副本中选择项目。每次选择一个项目时,将其从列表中删除。清空列表后,制作新副本并继续。

(2) 使用 itertools 中的混洗操作为您提供列表的随机排列。遍历它。当你走到最后,得到一个新的随机排列。

【讨论】:

    【解决方案3】:

    你想像in-place random shuffling of a list一样使用random.shuffle

    import random
    
    employee = ["adam", "Scott", "Michael", "Andrew", "Mark", "Fernando", "Faith", "Steve", "Lee", "Amani", "Liv", "Nick A", "James", "Jake", "Brett", "Graham", "Fraser", "Jacob", "Chelsea", "Phil", "George", "Charley", "Emma", "Steph"]
    
    # Make 10 rounds of random selections
    for i in range(10):
        print(i)
        # Shuffle the list in new random order
        random.shuffle(employee)
        # Print a random employee without repetition in each round
        for random_employee in employee:
            print(random_employee)
    

    【讨论】:

    • 嗨,这是对列表进行洗牌并显示整个列表,我想一次显示一个列表项,然后在迭代结束时重新洗牌
    【解决方案4】:

    你可以试试这个,

    import random
    
    employee = ["adam", "Scott", "Michael", "Andrew", "Mark", "Fernando", "Faith", "Steve", "Lee", "Amani", "Liv", "Nick A", "James", "Jake", "Brett", "Graham", "Fraser", "Jacob", "Chelsea", "Phil", "George", "Charley", "Emma", "Steph"]
    
    employeecopy = employee
    
    while len(employeecopy) != 0:
      chosen = random.choice(employeecopy)
      employeecopy = list(set(employeecopy) - set([chosen]))
    

    在行动中看到它here

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多