Python การใช้ฟังก์ชัน zip() : รับองค์ประกอบของหลายรายการพร้อมกัน

ธุรกิจ

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

หากคุณต้องการกรอกหลายรายการโดยไม่ทราบจำนวนองค์ประกอบ โดยแต่ละรายการมีค่าต่างกัน ให้พิจารณาขั้นตอนต่อไปนี้

  1. กำหนดค่าที่จะกรอกสำหรับรายการทั้งหมด
  2. รับจำนวนองค์ประกอบสูงสุด
  3. เติมรายการทั้งหมดให้ครบตามจำนวนองค์ประกอบสูงสุด
  4. การใช้ฟังก์ชัน 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

มันใช้สัญกรณ์ความเข้าใจรายการและการขยายรายการโดย *

รับรายการทูเพิลของอิลิเมนต์ของ 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'>
Copied title and URL