Pertanyaan Bagaimana cara memilih item dari daftar secara acak?


Asumsikan saya memiliki daftar berikut:

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

Apa cara paling sederhana untuk mengambil item secara acak dari daftar ini?


1298
2017-11-20 18:42


asal


Jawaban:


Menggunakan random.choice:

import random

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

Untuk pemilihan acak kriptografi yang aman (misalnya untuk membuat kata sandi dari daftar kata), gunakan random.SystemRandom kelas:

import random

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

2129
2017-11-20 18:46



Jika Anda juga membutuhkan indeks:

foo = ['a', 'b', 'c', 'd', 'e']
from random import randrange
random_index = randrange(0,len(foo))
print foo[random_index]

125
2017-09-11 15:31



Jika Anda ingin secara acak memilih lebih dari satu item dari daftar, atau memilih item dari satu set, saya sarankan untuk menggunakan random.sample sebagai gantinya.

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] 

Jika Anda hanya menarik satu item dari daftar, pilihannya kurang kikuk, karena menggunakan sampel akan memiliki sintaks random.sample(some_list, 1)[0] dari pada random.choice(some_list).

Sayangnya, pilihan hanya berfungsi untuk satu keluaran dari rangkaian (seperti daftar atau tupel). Meskipun random.choice(tuple(some_set)) dapat menjadi opsi untuk mendapatkan satu item dari satu set.


107
2018-05-27 17:07



Saya mengusulkan skrip untuk menghapus item yang diambil secara acak dari daftar hingga kosong:

Mempertahankan a set dan menghapus elemen yang diambil secara acak (dengan choice) hingga daftar kosong.

s=set(range(1,6))
import random

while len(s)>0:
  s.remove(random.choice(list(s)))
  print(s)

Tiga jalur memberikan tiga jawaban berbeda:

>>> 
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([])

27
2018-05-13 02:47



Pada Python 3,6 Anda dapat menggunakan secrets modul, yang lebih disukai daripada random modul untuk kriptografi atau penggunaan keamanan.

Untuk mencetak elemen acak dari daftar:

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

Untuk mencetak indeks acak:

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

Untuk detailnya, lihat PEP 506.


27
2017-12-05 16:52



Ini adalah kode dengan variabel yang mendefinisikan indeks acak:

import random

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

Ini adalah kode tanpa variabel:

import random

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

Dan ini adalah kode dengan cara terpendek dan terpintar untuk melakukannya:

import random

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

(python 2.7)


7
2018-05-25 14:57



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

Dalam python 2:

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

Dalam python 3:

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

7
2017-11-29 16:40



jika Anda butuh indeks, gunakan saja:

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

random.choice melakukan hal yang sama :)


6
2017-12-23 22:06



Bagaimana cara memilih item dari daftar secara acak?

Asumsikan saya memiliki daftar berikut:

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

Apa cara paling sederhana untuk mengambil item secara acak dari daftar ini?

Jika Anda ingin dekat benar-benar acak, maka saya sarankan menggunakan SystemRandom objek dari random modul dengan choice metode:

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

Dan sekarang:

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

Jika Anda menginginkan pilihan pseudorandom yang deterministik, gunakan choice function (yang sebenarnya merupakan metode terikat pada a Random obyek):

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

Tampaknya acak, tetapi sebenarnya tidak, yang bisa kita lihat jika kita meninjaunya berulang kali:

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

4
2018-06-23 22:22



Kita juga bisa melakukan ini menggunakan 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)

3
2017-08-05 07:28