khafan3.py

به قسمت سوم خوش اومدین. قسمت اول رو اینجا و قسمت قبل که دوم باشه رو هم اینجا می‌تونین پیدا کنین.



1. کپی کردن لیست:

فرض کنین یه لیست داریم به این شکل:

>>> a = [1, 2, 3, 4]

و می‌خوایم یه نمونه دیگه ازش داشته باشیم تحت عنوان b. اولین چیزی که به ذهن هر کسی می‌رسه اینه که خب کاری نداره که، a رو می‌ریزیم تو b. ولی مسئله ای که هست اینه که بعد از اون کار، هر تغییری روی لیست دوم، لیست اول رو هم تحت تاثیر قرار می‌ده. یعنی:

نکنین این کارو >_<
نکنین این کارو >_<

حالا راه حل یه حرکت کاملا عجیب غریبه؛ اونم استفاده از Slicing هست (برای اطلاعات بیشتر درباره Slicing قسمت دوم رو ببینین؛ یا داکس پایتون .-. چرا که نه.)

یعنی اگه به جای ریختن a توی b، میایم [:]a رو می‌ریزیم توی b. یعنی:

حالا بهتر شد :)
حالا بهتر شد :)

اینجوری دوتا لیست دارین که مقادیرشون یکیه، ولی عملا دوتا لیست جدا هستند و می‌تونن سر هر کدوم هر بلایی که دلتون می‌خواد بیارین. البته برای نتیجه ی مشابه، دو تا راه دیگه هم هست:

#replace the second line (b = a[:]) with:
b = list(a) #or
b = a.copy() #python 3.x only

2. دیکشنری ها!

دیکشنری ها از اول رو مخم بودن، ولی خب مجبور شدم انتخاب "مصنوعی" (برعکسِ انتخاب طبیعی. کافیه یا بیشتر خراب کنم جُکم رو؟) بکنم و خودمو باهاشون وقف بدم :) درباره دیکشنری ها دونستن چندتا چیز کافیه.

اول اینکه برای مواقعی که هر کیس/مورد مختلف یه مقدار به خصوص داره استفاده می‌شن. به کیس ها key و به مقدار ها value می‌گن. عین مجموعه ها توی ریاضی راهنمایی (زوج مرتب). ساختار کلی دیکشنری ها به اینصورته:

>>> sampleDic = {'Ali' : 19, 'Hasan' : 10, 'Mitra' : 16, 'Nazgol' : 20, 'Ehsan' : 15}

دقت کنین که بر خلاف لیست ها، از { } استفاده می‌شه؛ و اینکه علامت مساوی نداره! چون رشته ی 'Ali' مساوی با عدد 19 نیست؛ بلکه مقدارِ متناظر با 'Ali'، عدد 19 هست.

دوم: اگه یه دیکشنری رو به لیست تبدیل کنین، فقط key ها رو لیست می‌کنه. یه همچین چیزی:

>>> peint(list(sampleDic))
['Ehsan', 'Hasan', 'Ali', 'Mitra', 'Nazgol']

سوم: اگه یه دیکشنری رو چاپ کنین، به ترتیب وارد کردن اطلاعات اهمیتی نمی‌ده و زوج مرتبی رو اول می‌نویسه که key کوچکتری داره. تو مثال بالا اسم ها رو مرتب می‌کنه؛ پس پرینت کردن لیست بالا همچین چیزی تحویلمون می‌ده:

>>> print(sampleDic)
{'Ehsan': 15, 'Hasan': 10, 'Ali': 19, 'Mitra': 16, 'Nazgol': 20} #'Ehsan' < 'Hasan' < ...

چهارم: برای دسترسی به value ها، کاری رو می‌کنیم که توی لیست با ایندکس می‌کنیم. یعنی:

دقت کنین که 1. فقط موقع تعریف دیکشنری از { } استفاده می‌شه. 2.هر کلید و هر مقدار، می‌تونن هر نوع داده ای باشن. تو مثال قبلی برای کلید های رشته ای مثل 'Ehsan'، مقادیر عددی داشتیم و تو این مثال برای کلید های عددی مقادیر رشته ای داریم. (اگه گرفتین مثال دوم چیه بگین فالوتون کنم *_*)

پنجم: مرتب کردن دیکشنری ها چیزیه که هدف اصلی بود از نوشتنِ این قسمت. مشخصه که دو راه داریم. مرتب کردن بر اساس مقادیر یا کلید ها؛ و مرتب کردنِ خود مقادیر یا کلید ها. (چهارتا شد که 😜)

اولی خود دیکشنری رو مرتب می‌کنه ولی دومی یه لیست می‌سازه و اون رو مرتب می‌کنه. خب پس داریم:

مرتب کردنِ کلید ها؛ یعنی هر کلیدی که داریم رو تو یه لیستِ مرتب شده خواهیم داشت:

>>> print(sorted(sampleDic))
['Ali', 'Ehsan', 'Hasan', 'Mitra', 'Nazgol']

مرتب کردنِ خود مقادیر؛ همون کار، برای مقدار هایی که توی دیکشنری داریم:

>>> print(sampleDic.values()) #sampleDic.values() is a list of values.
[10, 15, 16, 19, 20]

حالا قسمتِ سختش، یعنی مرتب کردن کل دیکشنری. برای مرتب کردن دیکشنری بر اساس کلید ها:

>>> print(sorted(sampleDic.items())
[('Ali', 19), ('Ehsan', 15), ('Hasan', 10), ('Mitra', 16), ('Nazgol', 20)]

حالا برای مرتب کردن دیکشنری، این بار بر اساس مقادیر:

>>> print(sorted(sampleDic.items(), key=lambda x: x[1])
[('Hasan', 10), ('Ehsan', 15), ('Mitra', 16), ('Ali', 19), ('Nazgol', 20)]

به راحتی می‌شه دید که همون کدِ بالاییه؛ با این تفاوت که معیارِ مرتب سازیش رو عوض کردیم. اون لامبدا (به عبارتی لاندا) هم از مواردیه که در آینده حتما ازش خواهم گفت؛ ولی اینجا کارش همینه که به تابع sorted بگه از حالت دیفالتت (که مرتب سازی بر اساس کلید ها هست) بیا بیرون و به جاش بر اساس مقادیر مرتب سازی رو انجام بده.