Kocok elemen dalam senarai dalam Python

Perniagaan

Jika anda ingin mengocok (isih secara rawak) elemen senarai (tatasusunan) dalam Python, gunakan modul rawak perpustakaan standard.

Terdapat dua fungsi: shuffle(), yang mengisih senarai asal secara rawak, dan sample(), yang mengembalikan senarai diisih secara rawak baharu. sample() boleh digunakan untuk rentetan dan tupel.

  • Kocok senarai asal:random.shuffle()
  • Hasilkan senarai baharu yang dikocok.:random.sample()
  • Kocok rentetan dan tupel
  • Betulkan benih nombor rawak

Jika anda ingin mengisih dalam tertib menaik atau menurun dan bukannya rawak, atau dalam susunan terbalik, lihat artikel berikut.

Kocok senarai asal:random.shuffle()

Fungsi shuffle() dalam modul rawak boleh mengisih senarai asal secara rawak.

import random

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

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

Hasilkan senarai baharu yang dikocok.:random.sample()

Sampel fungsi() dalam modul rawak boleh digunakan untuk mencipta senarai baharu yang diisih secara rawak, tanpa mengubah senarai asal.

sample() ialah fungsi yang secara rawak memilih dan mendapatkan semula elemen daripada senarai. Argumen pertama ialah senarai, dan argumen kedua ialah bilangan elemen yang perlu diambil. Lihat artikel berikut untuk butirannya.

Jika bilangan elemen yang akan dipilih oleh sample() ialah jumlah bilangan elemen dalam senarai, kami mendapat senarai baharu dengan semua elemen disusun secara rawak. Jumlah bilangan elemen dalam senarai diperolehi oleh len().

Objek asal tidak akan diubah.

l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]

lr = random.sample(l, len(l))
print(lr)
# [0, 3, 1, 4, 2]

print(l)
# [0, 1, 2, 3, 4]

Kocok rentetan dan tupel

Rentetan dan tupel tidak boleh diubah, jadi jika anda menggunakan random.shuffle() untuk menukar objek asal, anda akan mendapat ralat berikut.
TypeError

s = 'abcde'

# random.shuffle(s)
# TypeError: 'str' object does not support item assignment

t = tuple(range(5))
print(t)
# (0, 1, 2, 3, 4)

# random.shuffle(t)
# TypeError: 'tuple' object does not support item assignment

Jika anda ingin mengocok rentetan atau tupel, gunakan random.sample(), yang mencipta objek baharu.

Walaupun rentetan atau tupel dinyatakan sebagai argumen, random.sample() mengembalikan senarai, jadi ia perlu memprosesnya kembali kepada rentetan atau tupel.

Dalam kes rentetan, ia akan menjadi senarai aksara satu demi satu. Untuk menggabungkannya menjadi satu rentetan sekali lagi, gunakan kaedah join().

sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca

Untuk tupel, gunakan tuple(), yang mencipta tupel daripada senarai.

tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)

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 pemulaan dengan benih yang sama, ia sentiasa disusun semula dengan cara yang sama.

l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]

l = list(range(5))
random.seed(0)
random.shuffle(l)
print(l)
# [2, 1, 0, 4, 3]