Pilihan, sampel dan pilihan untuk memilih elemen secara rawak daripada senarai dalam Python.

Perniagaan

Pilihan fungsi(), sampel(), dan pilihan() dalam modul rawak pustaka standard Python boleh digunakan untuk memilih dan mendapatkan semula elemen secara rawak daripada senarai, tuple, rentetan atau objek jujukan lain (persampelan rawak).

choice() mendapat satu elemen, sample() dan choices() mendapatkan senarai berbilang elemen. sample() ialah pengekstrakan tidak boleh pulih tanpa pendua, choices() ialah pengekstrakan boleh pulih dengan pendua.

Maklumat berikut disediakan di sini.

  • Pilih satu elemen secara rawak.:random.choice()
  • Pilih berbilang elemen secara rawak (tiada pendua):random.sample()
  • Pilih berbilang elemen secara rawak (dengan pendua):random.choices()
  • Betulkan benih nombor rawak

Pilih satu elemen secara rawak.:random.choice()

Dengan fungsi modul rawak pilih(), satu elemen dipilih secara rawak daripada senarai dan boleh diambil semula.

import random

l = [0, 1, 2, 3, 4]

print(random.choice(l))
# 1

Perkara yang sama berlaku untuk tupel dan rentetan. Dalam kes rentetan, satu aksara dipilih.

print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy

print(random.choice('abcde'))
# b

Ralat jika senarai kosong, tupel atau rentetan dinyatakan sebagai hujah.

# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence

Pilih berbilang elemen secara rawak (tiada pendua):random.sample()

Dengan sampel fungsi () modul rawak, anda boleh mendapatkan berbilang elemen secara rawak daripada senarai. Tiada pertindihan elemen (pengeluaran tidak boleh dipulihkan).

Argumen pertama ialah senarai, dan argumen kedua ialah bilangan elemen yang perlu diambil. Senarai itu dikembalikan.

import random

l = [0, 1, 2, 3, 4]

print(random.sample(l, 3))
# [2, 4, 0]

print(type(random.sample(l, 3)))
# <class 'list'>

Jika hujah kedua ditetapkan kepada 1, senarai dengan satu elemen juga dikembalikan; jika ia ditetapkan kepada 0, senarai itu kosong. Jika hujah kedua ialah 1, senarai dengan satu elemen dikembalikan; jika 0, senarai kosong dikembalikan; jika hujah pertama lebih daripada bilangan elemen dalam senarai, ralat berlaku.

print(random.sample(l, 1))
# [3]

print(random.sample(l, 0))
# []

# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative

Jika hujah pertama ialah tuple atau rentetan, apa yang dikembalikan masih merupakan senarai.

print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']

print(random.sample('abcde', 2))
# ['b', 'e']

Jika anda ingin kembali ke tuple atau rentetan, gunakan tuple(),join().

print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')

print(''.join(random.sample('abcde', 2)))
# dc

Ambil perhatian bahawa nilai tidak dinilai, jadi jika senarai asal atau tupel mengandungi elemen dengan nilai yang sama, terdapat kemungkinan nilai yang sama akan dipilih.

l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

print(random.sample(l_dup, 3))
# [3, 1, 1]

Jika anda ingin mengelakkan nilai pendua, anda boleh menggunakan set() untuk menukarnya kepada set (jenis set) dan mengekstrak elemen unik sahaja, dan kemudian gunakan sample().

print(set(l_dup))
# {0, 1, 2, 3}

print(random.sample(set(l_dup), 3))
# [1, 3, 2]

Pilih berbilang elemen secara rawak (dengan pendua):random.choices()

Pilihan fungsi modul rawak() membolehkan anda mengambil berbilang elemen secara rawak daripada senarai, dan tidak seperti sampel(), ia membenarkan elemen pendua dipilih.

choices() ialah fungsi yang ditambahkan dalam Python 3.6. Ia tidak tersedia dalam versi terdahulu.

Argumen k menentukan bilangan elemen yang akan diambil. Penduaan dibenarkan, jadi bilangan elemen untuk diambil boleh lebih besar daripada bilangan elemen dalam senarai asal.

Memandangkan k ialah hujah kata kunci sahaja, adalah perlu untuk menentukan kata kunci, seperti k=3.

import random

l = [0, 1, 2, 3, 4]

print(random.choices(l, k=3))
# [2, 1, 0]

print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]

Nilai lalai bagi k ialah 1; jika ia ditinggalkan, senarai dengan 1 elemen dikembalikan.

print(random.choices(l))
# [1]

Pemberat hujah boleh digunakan untuk menentukan berat (kebarangkalian) bahawa setiap elemen akan dipilih, dan jenis elemen dalam senarai boleh int atau terapung.

print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]

print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]

Argumen cum_weights juga boleh ditentukan sebagai berat terkumpul. cum_weights dalam kod sampel berikut adalah bersamaan dengan pemberat pertama di atas.

print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]

Lalai untuk kedua-dua argumen berat dan cum_weights ialah Tiada, yang bermaksud bahawa setiap elemen dipilih dengan kebarangkalian yang sama.

Jika panjang (bilangan elemen) pemberat argumen atau cum_weights berbeza daripada senarai asal, ralat berlaku.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_

Ia juga merupakan ralat untuk menentukan pemberat dan cum_weights pada masa yang sama.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights

Kami telah menetapkan senarai sebagai hujah pertama sebagai contoh dalam kod sampel setakat ini, tetapi perkara yang sama berlaku untuk tupel dan rentetan.

Betulkan benih nombor rawak

Dengan memberikan integer arbitrari kepada seed() fungsi modul rawak, benih nombor rawak boleh dibetulkan dan penjana nombor rawak boleh dimulakan.

Selepas permulaan dengan benih yang sama, elemen sentiasa dipilih dengan cara yang sama.

random.seed(0)
print(random.choice(l))
# 3

random.seed(0)
print(random.choice(l))
# 3