ฟังก์ชัน zip() ในตัวของ Python รวมองค์ประกอบของอ็อบเจ็กต์ที่ทำซ้ำได้หลายรายการ (รายการ ทูเปิล ฯลฯ) และใช้เพื่อดึงองค์ประกอบของรายการหลายรายการในลูป for
ส่วนนี้อธิบายการใช้งานฟังก์ชัน zip() ต่อไปนี้
- รับองค์ประกอบของหลายรายการใน for loop
- การจัดการกับองค์ประกอบต่างๆ
zip()
:ฟังก์ชันจะละเว้นองค์ประกอบที่มากเกินไปitertools.zip_longest()
:ฟังก์ชันนี้จะเติมองค์ประกอบที่ขาดหายไป
- รับรายการทูเพิลของอิลิเมนต์ของ iterables หลายรายการ
รับองค์ประกอบของหลายรายการใน for loop
หากคุณต้องการดึงและใช้องค์ประกอบของออบเจ็กต์ที่วนซ้ำได้หลายรายการ (รายการ ทูเพิล ฯลฯ) ในเวลาเดียวกันในลูป for ให้ระบุเป็นอาร์กิวเมนต์ของฟังก์ชัน zip()
names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
ไม่ใช่แค่สอง แต่สามหรือมากกว่านั้นด้วย
points = [100, 85, 90] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 90
การจัดการกับองค์ประกอบต่างๆ
ฟังก์ชัน zip() ละเว้นองค์ประกอบจำนวนมาก
ในฟังก์ชัน zip() หากจำนวนขององค์ประกอบในแต่ละรายการแตกต่างกัน ระบบจะส่งคืนองค์ประกอบที่น้อยกว่า (สั้นกว่า) และจำนวนที่มากกว่าจะถูกละเว้น
names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
ฟังก์ชัน itertools.zip_longest() จะเติมองค์ประกอบที่ขาดหายไป
การใช้ zip_longest() ในโมดูล itertools ของไลบรารีมาตรฐาน เป็นไปได้ที่จะเติมองค์ประกอบที่ขาดหายไปด้วยค่าที่กำหนดเองเมื่อจำนวนขององค์ประกอบในแต่ละรายการแตกต่างกัน
โดยค่าเริ่มต้นจะเต็มไปด้วยไม่มี
from itertools import zip_longest names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip_longest(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave None
หากระบุอาร์กิวเมนต์ fillvalue อาร์กิวเมนต์จะถูกเติมด้วยค่านั้น
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
แม้ว่าจะมีหลายรายการที่มีองค์ประกอบที่ขาดหายไป ค่าที่จะเติมก็เหมือนกัน ไม่สามารถระบุค่าต่างๆ ได้
points = [100, 85] for name, age, point in zip_longest(names, ages, points, fillvalue=20): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 20 # Dave 20 20
เป็นไปได้ที่จะระบุค่าอื่นโดยใช้ zip_longest() ใน zip_longest() แต่ไม่สามารถนำไปใช้ได้จริง เนื่องจากคุณจำเป็นต้องทราบล่วงหน้าว่าองค์ประกอบใดของรายการขาดหายไป
หากคุณต้องการกรอกหลายรายการโดยไม่ทราบจำนวนองค์ประกอบ โดยแต่ละรายการมีค่าต่างกัน ให้พิจารณาขั้นตอนต่อไปนี้
- กำหนดค่าที่จะกรอกสำหรับรายการทั้งหมด
- รับจำนวนองค์ประกอบสูงสุด
- เติมรายการทั้งหมดให้ครบตามจำนวนองค์ประกอบสูงสุด
- การใช้ฟังก์ชัน zip()
fill_name = 'XXX' fill_age = 20 fill_point = 50 len_names = len(names) len_ages = len(ages) len_points = len(points) max_len = max(len_names, len_ages, len_points) names = names + [fill_name] * (max_len - len_names) ages = ages + [fill_age] * (max_len - len_ages) points = points + [fill_point] * (max_len - len_points) print(names) print(ages) print(points) # ['Alice', 'Bob', 'Charlie', 'Dave'] # [24, 50, 18, 20] # [100, 85, 50, 50] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
ในกระบวนการเติมองค์ประกอบให้มากที่สุด เราทำดังต่อไปนี้
- การเริ่มต้นรายการด้วยค่าและจำนวนขององค์ประกอบโดยพลการ
- + โอเปอเรเตอร์เพื่อเข้าร่วมรายการด้วยกัน
ถ้าเราแปลงเป็นฟังก์ชัน มันจะเป็นแบบนี้ รายการดั้งเดิมและค่าที่เติมรายการจะถูกระบุเป็นอาร์กิวเมนต์ iterables (list หรือ tuple) ตามลำดับ
def my_zip_longest(iterables, fillvalues): max_len = max(len(i) for i in iterables) return zip(*[list(i) + [v] * (max_len - len(i)) for i, v in zip(iterables, fillvalues)]) for name, age, point in my_zip_longest((names, ages, points), ('XXX', 20, 50)): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
มันใช้สัญกรณ์ความเข้าใจรายการและการขยายรายการโดย *
- บทความที่เกี่ยวข้อง:การใช้สัญกรณ์ความเข้าใจรายการ Python
รับรายการทูเพิลของอิลิเมนต์ของ iterables หลายรายการ
ฟังก์ชัน zip() ส่งคืนตัววนซ้ำ (ออบเจ็กต์ zip) ที่เป็นทูเพิลขององค์ประกอบของออบเจ็กต์ที่ทำซ้ำได้หลายรายการ
นอกจากนี้ยังสามารถใช้นอก for ลูป และเป้าหมายไม่จำกัดเพียงรายการ
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
หากคุณต้องการรับรายการองค์ประกอบของวัตถุที่วนซ้ำได้หลายรายการเป็นทูเพิล ให้ใช้ list() เพื่อสร้างรายการ
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>