หากคุณต้องการสับเปลี่ยน (เรียงลำดับแบบสุ่ม) องค์ประกอบของรายการ (อาร์เรย์) ใน Python ให้ใช้โมดูลสุ่มของไลบรารีมาตรฐาน
มีสองฟังก์ชัน: shuffle() ซึ่งจะสุ่มเรียงลำดับรายการดั้งเดิม และ sample() ซึ่งจะส่งคืนรายการที่เรียงลำดับแบบสุ่มใหม่ ตัวอย่าง () สามารถใช้สำหรับสตริงและทูเพิล
- สุ่มรายการเดิม:
random.shuffle()
- สร้างรายการใหม่ที่สับเปลี่ยน:
random.sample()
- สลับสตริงและทูเพิล
- แก้ไขเมล็ดตัวเลขสุ่ม
หากคุณต้องการเรียงลำดับจากน้อยไปมากหรือจากมากไปน้อยแทนการสุ่มหรือเรียงลำดับย้อนกลับ ให้ดูบทความต่อไปนี้
- บทความที่เกี่ยวข้อง:การเรียงลำดับรายการใน Python: ความแตกต่างระหว่าง sorted และ sorted
สุ่มรายการเดิม:random.shuffle()
ฟังก์ชัน shuffle() ในโมดูลสุ่มสามารถสุ่มเรียงลำดับรายการดั้งเดิมได้
import random
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
random.shuffle(l)
print(l)
# [1, 0, 4, 3, 2]
สร้างรายการใหม่ที่สับเปลี่ยน:random.sample()
ฟังก์ชัน sample() ในโมดูลสุ่มสามารถใช้เพื่อสร้างรายการใหม่ที่มีการเรียงลำดับแบบสุ่ม โดยไม่ต้องเปลี่ยนรายการเดิม
sample() เป็นฟังก์ชันที่สุ่มเลือกและดึงองค์ประกอบจากรายการ อาร์กิวเมนต์แรกคือรายการ และอาร์กิวเมนต์ที่สองคือจำนวนองค์ประกอบที่จะดึงข้อมูล ดูบทความต่อไปนี้สำหรับรายละเอียด
- บทความที่เกี่ยวข้อง:สุ่มเลือกองค์ประกอบจากรายการใน Python:
choice()
,sample()
,choices()
หากจำนวนองค์ประกอบที่จะเลือกโดย sample() คือจำนวนองค์ประกอบทั้งหมดในรายการ เราจะได้รายการใหม่พร้อมองค์ประกอบทั้งหมดแบบสุ่มเรียงลำดับ จำนวนองค์ประกอบทั้งหมดในรายการได้มาจาก len()
วัตถุเดิมจะไม่เปลี่ยนแปลง
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]
สลับสตริงและทูเพิล
สตริงและทูเพิลนั้นเปลี่ยนไม่ได้ ดังนั้นหากคุณใช้ random.shuffle() เพื่อเปลี่ยนออบเจกต์ดั้งเดิม คุณจะได้รับข้อผิดพลาดดังต่อไปนี้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
หากคุณต้องการสับเปลี่ยนสตริงหรือทูเพิล ให้ใช้ random.sample() ซึ่งสร้างอ็อบเจกต์ใหม่
แม้ว่าสตริงหรือทูเพิลจะถูกระบุเป็นอาร์กิวเมนต์ random.sample() จะส่งกลับรายการ ดังนั้นจำเป็นต้องประมวลผลกลับเป็นสตริงหรือทูเพิล
ในกรณีของสตริง จะเป็นรายการของอักขระทีละตัว หากต้องการรวมเป็นสตริงเดียวอีกครั้ง ให้ใช้เมธอด join()
sr = ''.join(random.sample(s, len(s)))
print(sr)
# bedca
สำหรับ tuples ให้ใช้ tuple() ซึ่งจะสร้าง tuple จากรายการ
tr = tuple(random.sample(t, len(l)))
print(tr)
# (0, 1, 2, 4, 3)
แก้ไขเมล็ดตัวเลขสุ่ม
โดยการให้จำนวนเต็มตามอำเภอใจกับ seed(ฟังก์ชันของโมดูลสุ่ม) เมล็ดตัวเลขสุ่มสามารถแก้ไขได้และตัวสร้างตัวเลขสุ่มสามารถเริ่มต้นได้
หลังจากเริ่มต้นด้วยเมล็ดพันธุ์เดียวกัน จะมีการเรียงลำดับใหม่ในลักษณะเดียวกันเสมอ
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]