چطور میتونم به صورت همزمان دو لیست رو پیمایش کنم؟
How do I iterate through two lists in parallel?
من دو تا لیست دارم که میخوام به صورت همزمان روی هر دو تا پیمایش کنم. یعنی وقتی دارم روی عنصر اول لیست اول کار میکنم، همزمان عنصر اول لیست دوم رو هم در نظر بگیرم و همینطور ادامه بدم. چطور باید اینکار رو انجام بدم؟
برای این کار بهترین و سادهترین راه استفاده از تابع zip در پایتون هست. این تابع بهت این امکان رو میده که به صورت همزمان روی چند لیست پیمایش کنی. هر بار که این تابع رو فراخوانی میکنی، یک جفت (یا n-تایی اگر بیشتر از دو لیست داری) از عناصر لیستها بهت برمیگردونه. مثال سادهاش رو اینجا میتونی ببینی:
list1 = [1, 2, 3] list2 = ['a', 'b', 'c'] # Iterate over both lists in parallel for item1, item2 in zip(list1, list2): print(f'Item from list1: {item1}, Item from list2: {item2}')
در این مثال، هر بار که حلقه for اجرا میشه، یک آیتم از list1 و یک آیتم از list2 همزمان گرفته میشه و میتونی باهاشون هر کاری که میخوای انجام بدی. خروجی این کد به صورت زیره:
Item from list1: 1, Item from list2: a Item from list1: 2, Item from list2: b Item from list1: 3, Item from list2: c
این کد خیلی تمیز و قابل فهمه و مطمئناً همون کاری که میخوای رو به بهترین شکل انجام میده.
اگه لیستهات طولشون با هم برابر نباشه، فقط به اندازه کوتاهترین لیست پیمایش انجام میشه. اما اگه بخوای همه عناصر هر دو لیست رو پیمایش کنی، حتی وقتی طولشون با هم برابر نیست، میتونی از itertools.zip_longest استفاده کنی. این هم یه مثال براش:
from itertools import zip_longest list1 = [1, 2, 3] list2 = ['a', 'b'] # Iterate over both lists in parallel, filling missing values with None for item1, item2 in zip_longest(list1, list2): print(f'Item from list1: {item1}, Item from list2: {item2}')
این کد، مقدار None رو برای عناصری که در یکی از لیستها موجود نیست، برمیگردونه. خروجی این کد به این صورته:
Item from list1: 1, Item from list2: a Item from list1: 2, Item from list2: b Item from list1: 3, Item from list2: None