สับเปลี่ยนองค์ประกอบในรายการใน Python

ธุรกิจ

หากคุณต้องการสับเปลี่ยน (เรียงลำดับแบบสุ่ม) องค์ประกอบของรายการ (อาร์เรย์) ใน Python ให้ใช้โมดูลสุ่มของไลบรารีมาตรฐาน

มีสองฟังก์ชัน: shuffle() ซึ่งจะสุ่มเรียงลำดับรายการดั้งเดิม และ sample() ซึ่งจะส่งคืนรายการที่เรียงลำดับแบบสุ่มใหม่ ตัวอย่าง () สามารถใช้สำหรับสตริงและทูเพิล

  • สุ่มรายการเดิม:random.shuffle()
  • สร้างรายการใหม่ที่สับเปลี่ยน:random.sample()
  • สลับสตริงและทูเพิล
  • แก้ไขเมล็ดตัวเลขสุ่ม

หากคุณต้องการเรียงลำดับจากน้อยไปมากหรือจากมากไปน้อยแทนการสุ่มหรือเรียงลำดับย้อนกลับ ให้ดูบทความต่อไปนี้

สุ่มรายการเดิม: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() เป็นฟังก์ชันที่สุ่มเลือกและดึงองค์ประกอบจากรายการ อาร์กิวเมนต์แรกคือรายการ และอาร์กิวเมนต์ที่สองคือจำนวนองค์ประกอบที่จะดึงข้อมูล ดูบทความต่อไปนี้สำหรับรายละเอียด

หากจำนวนองค์ประกอบที่จะเลือกโดย 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]