首页 文章

如何从列表中随机选择一个项目?

提问于
浏览
1406

假设我有以下列表:

foo = ['a', 'b', 'c', 'd', 'e']

从此列表中随机检索项目的最简单方法是什么?

15 回答

  • -8

    这是带有定义随机索引的变量的代码:

    import random
    
    foo = ['a', 'b', 'c', 'd', 'e']
    randomindex = random.randint(0,len(foo)-1) 
    print (foo[randomindex])
    ## print (randomindex)
    

    这是没有变量的代码:

    import random
    
    foo = ['a', 'b', 'c', 'd', 'e']
    print (foo[random.randint(0,len(foo)-1)])
    

    这是最简单,最智能的代码:

    import random
    
    foo = ['a', 'b', 'c', 'd', 'e']
    print(random.choice(foo))
    

    (python 2.7)

  • 28
    foo = ['a', 'b', 'c', 'd', 'e']
    number_of_samples = 1
    

    在python 2中:

    random_items = random.sample(population=foo, k=number_of_samples)
    

    在python 3中:

    random_items = random.choices(population=foo, k=number_of_samples)
    
  • 128

    我们也可以使用randint来做到这一点 .

    from random import randint
    l= ['a','b','c']
    
    def get_rand_element(l):
        if l:
            return l[randint(0,len(l)-1)]
        else:
            return None
    
    get_rand_element(l)
    
  • 0

    一个简单的解决方案,如果你正在寻找这样的东西:

    from random import *
    library = ["New York", "Berlin", "Rome"]
    
    for x in range (10):
        i = randrange(0,3)
        print(library[i])
    
  • 7
    import random_necessary
    pick = ['Miss','Mrs','MiSs','Miss']
    print  pick [int(random_necessary.random_necessary() * len(pick))]
    

    我希望您觉得这个解决方案很有帮助 .

  • 5

    从Python 3.6开始,您可以使用secrets模块,该模块比random模块更适用于加密或安全用途 .

    要从列表中打印随机元素:

    import secrets
    foo = ['a', 'b', 'c', 'd', 'e']
    print(secrets.choice(foo))
    

    要打印随机索引:

    print(secrets.randbelow(len(foo)))
    

    有关详细信息,请参阅PEP 506 .

  • 136

    如果您还需要索引,请使用random.randrange

    from random import randrange
    random_index = randrange(len(foo))
    print(foo[random_index])
    
  • 2

    我提出了一个脚本,用于从列表中删除随机拾取的项目,直到它为空:

    保持 set 并删除随机拾取的元素(使用 choice ),直到列表为空 .

    s=set(range(1,6))
    import random
    
    while len(s)>0:
      s.remove(random.choice(list(s)))
      print(s)
    

    三次运行给出三个不同的答案:

    >>> 
    set([1, 3, 4, 5])
    set([3, 4, 5])
    set([3, 4])
    set([4])
    set([])
    >>> 
    set([1, 2, 3, 5])
    set([2, 3, 5])
    set([2, 3])
    set([2])
    set([])
    
    >>> 
    set([1, 2, 3, 5])
    set([1, 2, 3])
    set([1, 2])
    set([1])
    set([])
    
  • 7

    以下代码演示了是否需要生成相同的项目 . 您还可以指定要提取的样本数 .
    sample 方法返回一个包含来自总体的元素的新列表,同时保持原始总体不变 . 结果列表按选择顺序排列,因此所有子切片也将是有效的随机样本 .

    import random as random
    random.seed(0)  # don't use seed function, if you want different results in each run
    print(random.sample(foo,3))  # 3 is the number of sample you want to retrieve
    
    Output:['d', 'e', 'a']
    
  • 6

    我这样做是为了让它起作用:

    import random
    pick = ['Random','Random1','Random2','Random3']
    print  (pick[int(random.random() * len(pick))])
    
  • 6

    如果你需要索引只需使用:

    import random
    foo = ['a', 'b', 'c', 'd', 'e']
    print int(random.random() * len(foo))
    print foo[int(random.random() * len(foo))]
    

    random.choice做同样的事:)

  • -21

    如何从列表中随机选择项目?假设我有以下列表:foo = ['a','b','c','d','e']
    从此列表中随机检索项目的最简单方法是什么?

    如果你想接近 truly random ,那么我建议使用 random 模块中的 SystemRandom 对象和 choice 方法:

    >>> import random
    >>> sr = random.SystemRandom()
    >>> foo = list('abcde')
    >>> foo
    ['a', 'b', 'c', 'd', 'e']
    

    现在:

    >>> sr.choice(foo)
    'd'
    >>> sr.choice(foo)
    'e'
    >>> sr.choice(foo)
    'a'
    >>> sr.choice(foo)
    'b'
    >>> sr.choice(foo)
    'a'
    >>> sr.choice(foo)
    'c'
    >>> sr.choice(foo)
    'c'
    

    如果需要确定性伪随机选择,请使用 choice 函数(实际上是 Random 对象上的绑定方法):

    >>> random.choice
    <bound method Random.choice of <random.Random object at 0x800c1034>>
    

    这似乎是随机的,但实际上并非如此,如果我们重复重复它,我们可以看到它:

    >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
    ('d', 'a', 'b')
    >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
    ('d', 'a', 'b')
    >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
    ('d', 'a', 'b')
    >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
    ('d', 'a', 'b')
    >>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
    ('d', 'a', 'b')
    
  • 2273

    如果您想从列表中随机选择多个项目,或从集合中选择一个项目,我建议您改用 random.sample .

    import random
    group_of_items = {1, 2, 3, 4}               # a sequence or set will work here.
    num_to_select = 2                           # set the number to select here.
    list_of_random_items = random.sample(group_of_items, num_to_select)
    first_random_item = list_of_random_items[0]
    second_random_item = list_of_random_items[1]
    

    如果您只从列表中提取单个项目,则选择不那么笨重,因为使用示例将使用语法 random.sample(some_list, 1)[0] 而不是 random.choice(some_list) .

    不幸的是,选择仅适用于序列的单个输出(例如列表或元组) . 虽然 random.choice(tuple(some_set)) 可能是从集合中获取单个项目的选项 .

    EDIT: Using Secrets

    正如许多人所指出的,如果你需要更安全的伪随机样本,你应该使用秘密模块:

    import secrets                              # imports secure module.
    secure_random = secrets.SystemRandom()      # creates a secure random object.
    group_of_items = {1, 2, 3, 4}               # a sequence or set will work here.
    num_to_select = 2                           # set the number to select here.
    list_of_random_items = secure_random.sample(group_of_items, num_to_select)
    first_random_item = list_of_random_items[0]
    second_random_item = list_of_random_items[1]
    
  • 33

    numpy 解决方案:numpy.random.choice

    对于这个问题,它的作用与接受的答案( import random; random.choice() )相同,但是我添加了它,因为程序员可能已经导入 numpy (像我一样)并且还有some differences between the two methods可能与您的实际用例有关 .

    import numpy as np    
    np.random.choice(foo) # randomly selects a single item
    

    为了重现性,您可以:

    np.random.seed(123)
    np.random.choice(foo) # first call will always return 'c'
    

    对于 one or more items 的样本,以 array 形式返回,传递 size 参数:

    np.random.choice(foo, 5)          # sample with replacement (default)
    np.random.choice(foo, 5, False)   # sample without replacement
    
  • -1

    使用random.choice

    import random
    
    foo = ['a', 'b', 'c', 'd', 'e']
    print(random.choice(foo))
    

    对于加密安全随机选择(例如,用于从词列表生成密码短语),请使用random.SystemRandom class:

    import random
    
    foo = ['battery', 'correct', 'horse', 'staple']
    secure_random = random.SystemRandom()
    print(secure_random.choice(foo))
    

相关问题