Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีประมวลผลตัววนซ้ำแบบขนานโดยใช้ ZIP


แนะนำตัว

ความเข้าใจรายการทำให้ง่ายต่อการใช้รายการแหล่งที่มาและรับรายการที่ได้รับโดยใช้นิพจน์ ตัวอย่างเช่น สมมติว่าฉันต้องการคูณแต่ละองค์ประกอบในรายการด้วย 5 ในที่นี้ ฉันทำได้โดยใช้ for loop แบบง่าย

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
multiply_by_5 = []
for x in a:
multiply_by_5.append(x*5)
print(f"Output \n *** {multiply_by_5}")

ผลลัพธ์

*** [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

ด้วยการทำความเข้าใจรายการ ฉันสามารถบรรลุผลลัพธ์เดียวกันโดยการระบุนิพจน์และลำดับอินพุตที่จะวนซ้ำ

# List comprehension
multiply_by_5 = [x*2 for x in a]
print(f"Output \n *** {multiply_by_5}")

ผลลัพธ์

*** [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

ตอนนี้ สมมติว่าคุณมีรายการเพิ่มเติมอีกสองสามรายการ

# 1 . Create a List of Numbers
list1 = [100, 200, 300, 400]
list2 = [500, 600, 700, 800]

# 2. Add the two lists to create a new list
list3 = []

# Using a Loop.
for i in range(len(list1)):
added_value = list1[i] + list2[i]
list3.append(added_value)
print(f"Output \n*** {list3}")

ผลลัพธ์

*** [600, 800, 1000, 1200]

สิ่งสำคัญในตอนนี้คือไอเท็มในรายการที่ได้รับ (list3 ในกรณีของเรา) ของค่าที่เพิ่มเข้ามาเกี่ยวข้องโดยตรงกับรายการในรายการต้นทางโดยดัชนีของพวกมัน

ตราบใดที่การซิปดำเนินไป ต่อไปนี้คือวิธีแก้ปัญหา zip สำหรับจำนวนเต็มในรายการเดียวกัน ในกรณีนี้ รายการจำนวนเต็มสองรายการ รายการหนึ่งประกอบด้วย 100 200 300 และ 400 และรายการหนึ่งประกอบด้วย 500 600 700 และ 800 และแน่นอน เราสามารถกำหนดสิ่งเหล่านั้นและกำหนดให้กับตัวแปรได้ และไม่จำเป็นต้องเป็นรายการ

อาจเป็นลำดับอื่นๆ เช่น ทูเพิล เป็นต้น

สิ่งที่เราจะทำคือบีบอัดคู่ขององค์ประกอบจากสิ่งเหล่านั้น ดังนั้น 100 จาก list1 และ 500 จาก list2 จะถูกบีบอัดเข้าด้วยกัน เป็นต้น สำหรับแต่ละ tuple เมื่อเราวนซ้ำ เราจะแยก tuple ออกเป็นตัวแปร a และ b

list4 = []
list4 = [(a + b) for a, b in zip(list1, list2)]
print(f"Output \n*** {list4}")

ผลลัพธ์

*** [600, 800, 1000, 1200]

ตอนนี้วิธีแก้ปัญหาด้านบนดูดีมาก แต่มีปัญหาร้ายแรงที่คุณต้องรู้ก่อนนำไปใช้ในโค้ดของคุณ

ฟังก์ชัน zip ในตัวจะทำงานผิดปกติหากตัววนซ้ำอินพุตมีความยาวต่างกัน ให้เราได้ลองกัน

# add a new number to the list
list1.append(1000)
print(f"Output \n*** Length of List1 is {len(list1)} , Length of List2 is {len(list2)}")

# run the zip against the list for addition.
list5 = [(a + b) for a, b in zip(list1, list2)]
print(f"*** {list5}")

ผลลัพธ์

*** Length of List1 is 9 , Length of List2 is 4
*** [600, 800, 1000, 1200]

เมื่อเราพิมพ์หมายเลขที่เพิ่มแต่ละรายการออกจาก list3 คุณจะสังเกตเห็นว่าหมายเลขที่เพิ่มไปยัง list1 หายไป แม้ว่าเราจะต่อท้ายหมายเลขนั้นและอยู่ใน list1 ก็ไม่แสดงในผลลัพธ์ของ zip

และนี่เป็นเพียงวิธีการทำงานของซิป มันทำให้คุณอยู่ใน tuples จนกว่าจะมีตัววนซ้ำตัวใดตัวหนึ่งหมด ดังนั้นแม้ว่า list1 จะต้องไปมากกว่าเมื่อเปรียบเทียบกับ list2 แต่ก็หมดลงก่อนแล้วจึงออกจากลูป

น่าแปลกที่คุณไม่ได้รับแจ้งด้วยข้อยกเว้นใดๆ ดังนั้นคุณจึงต้องระมัดระวังอย่างมากกับไฟล์ zip ในการผลิต

คุณมีตัวเลือกสำหรับปัญหานี้ในฟังก์ชัน python จาก itertools ที่เรียกว่า zip ยาวที่สุด

ซิปที่ยาวที่สุดคืออะไร รูดต่อได้แม้ตัววนซ้ำตัวใดตัวหนึ่งหมดลง

from itertools import zip_longest

list6 = []
for a, b in zip_longest(list1, list2):
if b is None:
print(f" << do your logic here >> ")
elif a is None:
print(f" << do your logic here >> ")
else:
list6.append(a + b)
print(f"Output \n*** {list6}")


<< do your logic here >>
<< do your logic here >>
<< do your logic here >>
<< do your logic here >>
<< do your logic here >>

ผลลัพธ์

*** [600, 800, 1000, 1200]

บทสรุป :

  • ฟังก์ชัน zip มีประโยชน์มากหากคุณต้องการวนซ้ำหลายๆ ตัวพร้อมกัน

  • ฟังก์ชัน zip ทำงานแตกต่างกันเมื่อคุณส่งตัววนซ้ำที่มีความยาวต่างกัน

  • ในกรณีที่คุณต้องการใช้ตัววนซ้ำที่มีความยาวต่างกัน ให้ใช้ zip_longest