مقایسه بزرگی کوچیکی لیست پایتون

هیچ می‌دونستین که تو پایتون می‌تونین برای لیست ها و توپل ها عبارت هایی مثل [1,2,3]>[0,2,3] نوشت؟ یعنی می‌تونی خیلی راحت لیست ها رو باهم مقایسه کنی.

اخیرا در یکی از پروژه هایی که داشتم نیاز داشتم تا دو مقدار ورژن رو باهم مقایسه کنم تا مثلا اگر نسخه دوم از اولی جدید تر بود برنامه خودش رو آپدیت کنه، برای اینکار از یک امکان زبان پایتون یعنی مقایسه لیست ها در پایتون استفاده کردم. با من بهنام سیم‌جو همراه باش تا برات بگم ماجرا چیه!

من معمولا از شیوه Semantic Versioning (نسخه‌سازی معنایی😐) استفاده می‌کنم؛ به طور خلاصه این همون شیوه رایج نسخه سازی بین برنامه هاست. بنابراین یک سری عدد داریم که با نقطه از هم جدا شدن و به ترتیب از چپ به راست major.minor.patch هستن. مثلا می‌دونیم که نسخه ۲.۳.۴ از نسخه ۲.۳.۳ جدید تر هست، و همینطور ۳.۰.۰ جدید‌ترین اونها!

شاید با خودتون بگین که کاری نداره که! اگه نقطه ها رو حذف کنیم و به هم بچسبونیم، میشه یه عدد مثل ۲۳۴ که از ۲۳۳ بیشتره ولی اونوقت تو نسخه هایی مثل ۲۱.۳.۴ و ۲.۱۳.۴ چیکار کنیم؟!

پس هر کدوم از اعداد باید جدا جدا با رعایت ارجعیت مقایسه بشن. برای اینکار حدود ۶ خط کد (در ادامه نوشتم) لازم میشه ولی خب پایتون کار رو برامون ساده کرده! پایتون می‌تونه لیست و توپل رو هم مقایسه کنه!

اگر بخواهم کد پایتونی معادل این عملکرد را براتون بنویسم چنین چیزی خواهد بود:

def gtr (left, right):    # code for left_list>right_list
  for a,b in zip(left,right):
    if a==b:
      continue
    return a>b
  return len(left)>len(right)

فکر می‌کنم کد بالا گویای مطلب باشه! برای مقایسه‌ی لیست و توپل از اولین عضو شروع می‌کنیم، کاری که zip می‌کنه اینه که همزمان یه عضو از آرایه اول و یه عضو هم از آرایه دوم بهمون میده؛ همچنین هرکدوم از آرایه ها که تموم بشه zip حلقه رو خاتمه میده. توی حلقه میگیم که اگه هر دو برابر بودند، به مقایسه ادامه بده، در غیر این صورت حاصل مقایسه رو برگردونه، این یعنی اگر عضو لیست اول بزرگتر بود True و در غیر اینصورت False رو بر می‌گردونه.

حلقه با کوتاه ترین لیست تموم میشه، پس طول لیست ها رو هم مقایسه می‌کنیم که اگه لیست اولی بزرگ تر بود نتیجه True میشه.

پس برای مقایسه دو لیست اولین عضوی که بزرگ تر باشد جدای از طول لیست ها نتیجه را صحیح می‌کند، اگر اعضا برابر بودند سپس طول آن ها مقایسه می‌شود. با این حساب نتیجه مقایسه های زیر True هستند:

[1,2,3]   > [0,1,2,3,4]
[1,2,3,4] > [1,2,3]
[1,2,4]   > [1,2,3]
[1,0,0]   > [0,0,1]