ตัวเลือก ตัวอย่าง และตัวเลือกเพื่อสุ่มเลือกองค์ประกอบจากรายการใน Python

ธุรกิจ

ตัวเลือกฟังก์ชัน (), ตัวอย่าง () และตัวเลือก () ในโมดูลสุ่มของไลบรารีมาตรฐาน Python สามารถใช้สุ่มเลือกและดึงองค์ประกอบจากรายการ ทูเพิล สตริง หรือออบเจกต์ลำดับอื่นๆ (สุ่มตัวอย่าง)

Choice() ได้รับองค์ประกอบเดียว, ตัวอย่าง () และตัวเลือก () รับรายการองค์ประกอบหลายรายการ sample() เป็นการดึงข้อมูลที่ไม่สามารถกู้คืนได้โดยไม่มีการซ้ำกัน, options() คือการแยกข้อมูลที่กู้คืนได้พร้อมกับรายการที่ซ้ำกัน

ข้อมูลต่อไปนี้มีให้ที่นี่

  • เลือกหนึ่งองค์ประกอบโดยการสุ่ม:random.choice()
  • สุ่มเลือกหลายองค์ประกอบ (ไม่ซ้ำกัน):random.sample()
  • สุ่มเลือกหลายองค์ประกอบ (ซ้ำกัน):random.choices()
  • แก้ไขเมล็ดตัวเลขสุ่ม

เลือกหนึ่งองค์ประกอบโดยการสุ่ม:random.choice()

ด้วยฟังก์ชันของโมดูลสุ่ม select() องค์ประกอบหนึ่งจะถูกสุ่มเลือกจากรายการและสามารถดึงข้อมูลได้

import random

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

print(random.choice(l))
# 1

เช่นเดียวกับทูเพิลและสตริง ในกรณีของสตริง จะมีการเลือกอักขระตัวเดียว

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

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

เกิดข้อผิดพลาดหากมีการระบุรายการว่าง ทูเพิล หรือสตริงเป็นอาร์กิวเมนต์

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

สุ่มเลือกหลายองค์ประกอบ (ไม่ซ้ำกัน):random.sample()

ด้วยฟังก์ชัน sample() ของโมดูลสุ่ม คุณสามารถรับหลายองค์ประกอบโดยการสุ่มจากรายการ ไม่มีการทำซ้ำขององค์ประกอบ (การสกัดที่ไม่สามารถกู้คืนได้)

อาร์กิวเมนต์แรกคือรายการ และอาร์กิวเมนต์ที่สองคือจำนวนองค์ประกอบที่จะดึงข้อมูล รายการจะถูกส่งกลับ

import random

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

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

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

หากอาร์กิวเมนต์ที่สองถูกตั้งค่าเป็น 1 รายการที่มีองค์ประกอบหนึ่งจะถูกส่งกลับด้วย หากตั้งค่าเป็น 0 รายการจะว่างเปล่า ถ้าอาร์กิวเมนต์ที่สองคือ 1 รายการที่มีองค์ประกอบเดียวจะถูกส่งคืน หากเป็น 0 รายการว่างจะถูกส่งคืน ถ้าอาร์กิวเมนต์แรกมากกว่าจำนวนองค์ประกอบในรายการ จะเกิดข้อผิดพลาด

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

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

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

ถ้าอาร์กิวเมนต์แรกเป็นทูเพิลหรือสตริง สิ่งที่ส่งคืนยังคงเป็นรายการ

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

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

หากคุณต้องการกลับไปที่ tuple หรือ string ให้ใช้ tuple(),join()

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

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

โปรดทราบว่าค่าจะไม่ถูกตัดสิน ดังนั้นหากรายการดั้งเดิมหรือทูเพิลมีองค์ประกอบที่มีค่าเท่ากัน มีความเป็นไปได้ที่จะเลือกค่าเดียวกัน

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

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

หากคุณต้องการหลีกเลี่ยงค่าที่ซ้ำกัน คุณสามารถใช้ set() เพื่อแปลงเป็น set (set type) และแยกเฉพาะองค์ประกอบที่ไม่ซ้ำ จากนั้นใช้ sample()

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

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

สุ่มเลือกหลายองค์ประกอบ (ซ้ำกัน):random.choices()

ตัวเลือกฟังก์ชันของโมดูลสุ่ม () ช่วยให้คุณสามารถดึงข้อมูลหลายองค์ประกอบโดยการสุ่มจากรายการ และไม่เหมือนกับตัวอย่าง () ซึ่งช่วยให้สามารถเลือกองค์ประกอบที่ซ้ำกันได้

options() เป็นฟังก์ชันที่เพิ่มใน Python 3.6 ไม่มีในเวอร์ชันก่อนหน้า

อาร์กิวเมนต์ k ระบุจำนวนขององค์ประกอบที่จะดึงข้อมูล อนุญาตให้ทำซ้ำได้ ดังนั้นจำนวนองค์ประกอบที่จะดึงข้อมูลอาจมีมากกว่าจำนวนองค์ประกอบในรายการดั้งเดิม

เนื่องจาก k เป็นอาร์กิวเมนต์เฉพาะคีย์เวิร์ด จึงจำเป็นต้องระบุคีย์เวิร์ด เช่น 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]

ค่าเริ่มต้นของ k คือ 1; หากละเว้น รายการที่มี 1 องค์ประกอบจะถูกส่งคืน

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

น้ำหนักอาร์กิวเมนต์สามารถใช้เพื่อระบุน้ำหนัก (ความน่าจะเป็น) ที่แต่ละองค์ประกอบจะถูกเลือก และชนิดขององค์ประกอบในรายการสามารถเป็น int หรือ float

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]

อาร์กิวเมนต์ cum_weights ยังสามารถระบุเป็นน้ำหนักสะสม cum_weights ในโค้ดตัวอย่างต่อไปนี้จะเทียบเท่ากับน้ำหนักตัวแรกด้านบน

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

ค่าเริ่มต้นสำหรับทั้งน้ำหนักอาร์กิวเมนต์และ cum_weights คือ ไม่มี ซึ่งหมายความว่าแต่ละองค์ประกอบจะถูกเลือกด้วยความน่าจะเป็นเท่ากัน

หากความยาว (จำนวนองค์ประกอบ) ของน้ำหนักอาร์กิวเมนต์หรือ cum_weights แตกต่างจากรายการเดิม จะเกิดข้อผิดพลาดขึ้น

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

นอกจากนี้ยังเป็นข้อผิดพลาดในการระบุน้ำหนักและ cum_weights พร้อมกัน

# 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

เราได้ระบุรายการเป็นอาร์กิวเมนต์แรกเป็นตัวอย่างในโค้ดตัวอย่าง แต่สิ่งเดียวกันนี้ใช้กับทูเพิลและสตริง

แก้ไขเมล็ดตัวเลขสุ่ม

โดยการให้จำนวนเต็มตามอำเภอใจกับ seed(ฟังก์ชันของโมดูลสุ่ม) เมล็ดตัวเลขสุ่มสามารถแก้ไขได้และตัวสร้างตัวเลขสุ่มสามารถเริ่มต้นได้

หลังจากเริ่มต้นด้วยเมล็ดพันธุ์เดียวกัน องค์ประกอบจะถูกเลือกในลักษณะเดียวกันเสมอ

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

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