16 سؤال متداول از لیست در پایتون
0 1402/02/19

16 سؤال متداول از لیست در پایتون

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

تور آموزشی: آموزش لیست در پایتون

سؤال 1: هنگام پیمایش یک لیست با حلقه for در پایتون چگونه به اندیس دسترسی داشته باشیم؟

مثلا در لیست زیر می‌خواهیم هر عضو لیست به همراه اندیس آن چاپ شود.

squares = [0, 1, 4, 9, 16, 25]

جواب: برای این کار از تابع enumerate استفاده می‌کنیم.

for index, value in enumerate(squares):
    print(index, value)

سؤال 2: فرض کنیم لیستی از لیست‌ها داشته باشیم. چطور باید آن را به یک لیست تبدیل کنیم؟

مثلا می‌خواهیم لیست [[1, 2], [3, 4, 5, 6], [7, 8]] را به [1, 2, 3, 4, 5, 6, 7, 8] تبدیل کنیم.

جواب: فرض کنیم primary_list = [[1, 2], [3, 4, 5, 6], [7, 8]] لیستی از لیست‌ها باشد. با دستور زیر که نمایش خلاصه لیست (list comprehension) است این کار را به سادگی انجام می‌دهد.

final_list = [item for sublist in primary_list for item in sublist]

دستور بالا معادل با قطعه کد زیر است.

final_list = []
for sub_list in primay_list:
    for item in sub_list:
        final_list.append(item)

لازم به ذکر است به این کار flat کردن لیست در زبان پایتون می‌گویند و راه‌های زیادی برای آن وجود دارد. در اینجا به یکی از راه‌های آسان و سرراست اشاره شد.

سؤال 3: چطور باید اندیس یک عنصر در لیست را پیدا کنیم؟

فرض کنیم لیست numbers = [9, 99, 5, 55, 4, 44, 55] داده شده باشد. اندیس 55 را چطور پیدا کنیم؟

جواب: پایتون برای پیدا کردن اندیس یک عنصر در لیست از متد index استفاده می‌کند.

numbers.index(55)
>>> 3

اگر مانند مثال بالا چند عنصر با مقدار 55 داشته باشیم اندیس اولین عنصر (یعنی 3) بازگردانده می‌شود. در صورتی که بخواهیم اندیس همه این عناصر را داشته باشیم می‌توانیم از قطعه کد زیر استفاده کنیم.

index_list = [idx for idx, val in enumerate(numbers) if val == 55]
>>> [3, 6]

سؤال 4: چطور در زبان پایتون دو لیست را به هم بچسبانیم؟

فرض کنیم دو لیست کاملا جدا از هم داریم و می‌خواهیم آنها را به یکدیگر الحاق کنیم.

list1 = [1, 2, 3]
list2 = [4, 5, 6, 3]

جواب: با استفاده از عملگر + به سادگی می‌توان دو لیست را به هم متصل کرد.

list3 = list1 + list2
>>> [1, 2, 3, 4, 5, 6, 3]

سؤال 5: در زبان پایتون از کجا بفهمیم یک لیست خالی (تهی) است؟

فرض کنیم لیست a = [] داده شده است. می‌خواهیم بفهمیم این لیست تهی است یا نه.

جواب: از آنجایی که ارزش منطقی یک لیست خالی در زبان پایتون False است بنابراین با قطعه کد زیر به آسانی می‌توان به خالی بودن لیست پی برد.

if not a:
    print(“Empty List!”)

گاهی اوقات برنامه‌نویسان برای جواب چنین سؤالی تعداد عناصر لیست را شمارش می‌کنند و بررسی می‌کنند که آیا جواب صفر است یا نه. نیازی به شمارش تعداد اعضای لیست نیست و این روش توصیه نمی‌شود.

روش نادرست:

if len(a) == 0:
    print(“Empty List!”)

سؤال 6: چطور باید یک لیست را در لیست دیگر کپی کنیم؟

فرض کنیم لیست old_list = [1, 2, 3] را می‌خواهیم در یک لیست جدید به نام new_list کپی کنیم.

جواب: زمانی که بخواهیم یک لیست را فقط با تخصیص دادن کپی کنیم (new_list = old_list) به یک مشکل بزرگ برخورد می‌کنیم. در صورتی که یکی از لیست‌ها را تغییر دهیم دیگری نیز تغییر می‌کند. در واقع در این حالت لیست جدیدی به وجود نمی‌آید و متغیر جدید فقط یک ارجاع به مقادیر همان لیست قبلی است.

برای کپی کردن یکی لیست در زبان برنامه‌نویسی پایتون یک راه بسیار ساده وجود دارد و آن استفاده از متد copy است.

new_list = old_list.copy()

سؤال 7: در زبان پایتون تفاوت متدهای append و extend در لیست چیست؟

هر دو متد extend و append باعث افزوده شدن عضو به لیست می‌شوند. فرض کنیم لیست زیر از نام تعدادی خودرو داده شده است.

cars_list = [‘BMW’, ‘Benz’, ‘Ford’]

جواب: متد append یک عضو به انتهای لیست اضافه می‌کند اما متد extend یک لیست (یا هر مجموعه قابل پیمایش) دیگر را به لیست الحاق می‌کند. مثلا:

cars_list.append(‘Kia’)
>>> [‘BMW’, ‘Benz’, ‘Ford’, ‘Kia’]
cars_list.extend([‘Hyundai’, ‘Toyota’])
>>> [‘BMW’, ‘Benz’, ‘Ford’, ‘Kia’, ‘Hyundai’, ‘Toyota’]

توضیحات بالا روش متداول استفاده از متدهای append و extend است. در صورتی که بخواهیم دستور آخر را با append انجام دهیم پایتون لیست دوم را مانند یک عضو در نظر می‌گیرد.

cars_list.append([‘Hyundai’, ‘Toyota’])
>>> [‘BMW’, ‘Benz’, ‘Ford’, ‘Kia’, [‘Hyundai’, ‘Toyota’]]

سؤال 8: چطور به صورت تصادفی از یک لیست عضو انتخاب کنیم؟

لیست a = [1, -2, 3, -4, 5, -6, 7, -8] داده شده است. می‌خواهیم از آن عنصر انتخاب کنیم.

جواب: کتابخانه random در پایتون چند تابع برای این کار دارد. در صورتی که بخواهیم یک عنصر انتخاب کنیم از choice و در صورتی که اعضای بیشتری بخواهیم انتخاب کنیم از choices استفاده می‌کنیم.

import random
random.choice(a)
>>> 3
random.choices(a)
>>> [1, 7, -2]

تابع choices خروجی را به صورت لیست برمی‌گرداند. البته این تابع ممکن است عضوی را چندبار انتخاب کند. مثلا در دستور آخر ممکن است خروجی به صورت [1, 7, 1] باشد. در صورتی که بخواهیم عضو تکراری نداشته باشیم از تابع sample استفاده می‌کنیم.

random.sample(a, 3)
>>> [1, -2, -6]

البته گفتن این نکته نیز خالی از لطف نیست که کتابخانه random برای امور متداول مانند شبیه‌سازی (simulation) و مدل‌سازی (modelling) استفاده می‌شود. در صورتی که بخواهیم برای رمزنگاری و کارهای با امنیت بالا عنصر تصادفی انتخاب کنیم از کتابخانه secrets استفاده کنیم.

سؤال 9: چطور یک عنصر از لیست را با استفاده از اندیس آن حذف کنیم؟

فرض کنیم لیست a = [-1, 1, 66.25, 333, 333, 1234.5] داده شده است. می‌خواهیم با استفاده از اندیس یک یا چند عنصر از آن را حذف کنیم.

جواب: برای حذف عنصر از لیست در پایتون از روی اندیس از کلمه کلیدی del استفاده می‌کنیم.

del a[0]
>>> [1, 66.25, 333, 333, 1234.5]
del a[2:4]
>>> [1, 66.25, 1234.5]
del a[:]
>>> []

سؤال 10: چطور یک عنصر با مقدار خاص از لیست را حذف کنیم؟

فرض کنیم لیست a = [3, 9, 81, 9, 27] داده شده است. می‌خواهیم عدد 9 را حذف کنیم.

جواب: برای حذف کردن یک عنصر با مقدار مشخص از متد remove استفاده می‌کنیم.

a.remove(9)
>>> [3, 81, 9, 27]

در این حالت اولین عنصر با مقدار 9 حذف خواهد شد. در صورتی که بخواهیم تمام عناصری که مقدارشان 9 است حذف شوند از نمایش خلاصه لیست (list comprehension) استفاده می‌کنیم.

a = [x for x in a if x != 9]
>>> [3, 81, 27]

در حالتی که از متد remove استفاده می‌کنیم اگر عدد 9 در لیست موجود نباشد با خطا روبرو خواهیم شد.

سؤال 11: تعداد تکرار عناصر در لیست را چطور بدست آوریم؟

فرض کنیم لیست a = [2, 1, 3, 1, 1, 6, 2] داده شده باشد. ابتدا تعداد تکرار عنصر 1 و سپس تعداد تکرار هر عنصر را بدست می‌آوریم.

جواب: در صورتی که بخواهیم تعداد تکرار یک عنصر را بدست آوریم از متد count استفاده می‌کنیم.

a.count(1)
>>> 3

اگر بخواهیم تکرار هر عنصر را بدست آوریم از کلاس Counter استفاده می‌کنیم. این کلاس از کلاس dict (دیکشنری) مشتق شده است و مانند هر دیکشنری به صورت کلید-مقدار می‌توان به آن دسترسی داشت.

from collections import Counter
b = Counter(a)
print(b)
>>> Counter({1: 3, 2: 2, 3: 1, 6: 1})
b[1]
>>> 3

نکته مهم این است که نباید برای بدست آوردن تعداد تکرار همه عناصر از count در حلقه تکرار استفاده کرد. زیرا با هر بار فراخوانی متد count تمام لیست پیمایش می‌شود. بنابراین اگر لیست n عضو داشته باشد تعداد عملیات از مرتبه با n به توان 2 خواهد بود. در صورتی که استفاده از Counter زمان اجرا را از مرتبه n نگه خواهد داشت.

سؤال 12: چگونه یک لیست را از انتها به ابتدا پیمایش کنیم؟

فرض کنیم لیست a = [1, 2, 4, 8, 16] داده شده است. می‌خواهیم اعضای آن را از انتها به ابتدا چاپ کنیم.

جواب: برای این کار راه‌های مختلفی وجود دارد.

راه اول: استفاده از تابع reversed

for item in reversed(a):
    print(item)

دقت شود reversed(a) یک لیست جدید نیست. بلکه یک شیء از کلاس list_reverseiterator است.

راه دوم:

for item in a[::-1]:
    print(item)

سؤال 13: چطور در زبان پایتون دو لیست را به صورت همزمان پیمایش کنیم؟

فرض کنیم یک لیست از نوع برند تلفن همراه و یک لیست از قیمت ها در اختیار داریم. میخواهیم این دو لیست را همزمان پیمایش کنیم و اسم برند و قیمت آن را کنار هم چاپ کنیم.

phone_list = [‘samsung’, ‘apple’, ‘huawei’]
price_list = [1450, 1400, 1220]

جواب: برای پیمایش دو لیست به صورت همزمان در زبان پایتون از تابع zip استفاده می‌کنیم.

for phone, price in zip(phone_list, price_list):
    print(phone, price)

تعداد پیمایش‌ها در این حلقه به اندازه طول لیست کوچکتر است.

سؤال 14: چطور عناصر تکراری در لیست را حذف کنیم؟

فرض کنیم لیست a = [3, 9, 1, 2, 3, 1, 6, 1] داده شده است. می‌خواهیم یک لیست داشته باشیم که هیچ عنصر تکراری نداشته باشد.

جواب: برای حذف عناصر تکراری یک لیست در زبان پایتون ابتدا لیست را به مجموعه (set) تبدیل می‌کنیم. می‌دانیم یک مجموعه عضو تکراری ندارد. بنابراین تمام عناصر تکراری حذف خواهند شد. سپس مجموعه را دوباره به لیست تبدیل می‌کنیم.

a = list(set(a))
>>> [3, 9, 1, 2, 6]

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

راه دوم: در صورتی که ترتیب اعضا مهم باشد با توجه به اینکه در زبان پایتون از نسخه 3.7 به بعد دیکشنری‌ها دارای ترتیب هستند از دستور زیر استفاده می‌کنیم:

new_list = list(dict.fromkeys(a))
>>> [3, 9, 1, 2, 6]

در توضیح کد بالا دقت کنیم که متد fromkeys یک دیکشنری جدید می‌سازد که کلیدهای آن اعضای لیست a است و مقادیر هر کلید به صورت پیش‌فرض None است. بنابراین خروجی dict.fromkeys(a) یک دیکشنری است و با توجه به اینکه کلید دیکشنری نمی‌تواند تکراری باشد عملا مقادیر تکراری لیست حذف می‌شوند. علاوه بر این وقتی هر دیکشنری را تبدیل به لیست می‌کنیم (به لیست cast می‌کنیم) کلیدهای آن تبدیل به اعضای لیست می‌شود.

سؤال 15: چطور یک لیست را به رشته تبدیل کنیم؟

این سؤال را به این شکل نیز می‌توان مطرح کرد. چطور عناصر یک لیست را در یک رشته به هم بچسبانیم؟

فرض کنیم لیست a = [‘python’, ‘is’, ‘the’, ‘best’] داده شده باشد. می‌خواهیم “python is the best” را بدست آوریم.

جواب: برای چسباندن اعضای یک لیست در یکی رشته در زبان پایتون از متد join در رشته استفاده می‌کنیم.

b = " ".join(a)
>>> ‘python is the best’

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

“-“.join(a)
>>> python-is-the-best
“”.join(a)
>>> pythonisthebest

سؤال 16: در زبان پایتون چطور یک عضو به ابتدای لیست اضافه کنیم؟

فرض کنیم لیست a = [44, 444] داده شده است. می‌خواهیم عدد 4 را به ابتدای این لیست اضافه کنیم.

جواب: برای این کار از متد insert استفاده می‌کنیم.

a.insert(0, 4)
>>> [4, 44, 444]

راه دوم: استفاده از عملگر + است.

new_list = [4] + [44, 444]

البته راه اول متداول‌تر است.

ارسال نظر

0 نظر