لیست های پایتون

پایتون یک نوع لیست داخلی عالی به نام "list" دارد. حروف الفبای لیست در داخل پرانتز [ ] نوشته می شوند. لیست ها مشابه رشته ها کار می کنند -- از تابع len() و براکت های مربع [ ] برای دسترسی به داده ها استفاده کنید، با اولین عنصر در شاخص 0. (به اسناد رسمی لیست python.org مراجعه کنید.)

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

لیست رشته ها "قرمز" "آبی "سبز"

انتساب با یک = در لیست ها کپی نمی کند. در عوض، انتساب باعث می شود که دو متغیر به یک لیست در حافظه اشاره کنند.

  b = colors   ## Does not copy the list

هر دو رنگ و b به یک لیست اشاره می کنند

"فهرست خالی" فقط یک جفت پرانتز خالی است [ ]. "+" برای اضافه کردن دو لیست کار می کند، بنابراین [1، 2] + [3، 4] [1، 2، 3، 4] را به دست می دهد (این دقیقاً مانند + با رشته ها است).

FOR و IN

ساختارهای *for* و *in* پایتون بسیار مفید هستند و اولین استفاده از آنها با لیست است. ساختار *for* -- for var in list -- راهی آسان برای مشاهده هر عنصر در یک لیست (یا مجموعه دیگر) است. در طول تکرار از لیست اضافه یا حذف نکنید.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

اگر می‌دانید چه چیزی در لیست وجود دارد، از نام متغیری در حلقه استفاده کنید که اطلاعاتی مانند "num" یا "name" یا "url" را در بر می‌گیرد. از آنجایی که کد پایتون سینتکس دیگری برای یادآوری انواع ندارد، نام متغیرهای شما یک راه کلیدی برای شما است تا آنچه را که در حال انجام است مستقیم نگه دارید. (این کمی گمراه کننده است. همانطور که بیشتر در معرض پایتون قرار می گیرید، ارجاعاتی را برای تایپ نکات خواهید دید که به شما امکان می دهد اطلاعات تایپ را به تعاریف تابع خود اضافه کنید. پایتون از این نکات نوع در هنگام اجرای برنامه های شما استفاده نمی کند. توسط برنامه های دیگر مانند IDE ها (محیط های توسعه یکپارچه) و ابزارهای تجزیه و تحلیل ایستا مانند linters/type checkers برای تأیید اینکه آیا توابع شما با آرگومان های سازگار فراخوانی می شوند، استفاده می شوند.

ساختار *in* به خودی خود راهی آسان برای آزمایش اینکه آیا عنصری در یک لیست (یا مجموعه دیگری) ظاهر می شود - value in collection - آزمایش می کند که آیا مقدار در مجموعه است یا خیر، درست/نادرست را برمی گرداند.

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

سازه‌های for/in معمولاً در کد پایتون استفاده می‌شوند و بر روی انواع داده‌های غیر از لیست کار می‌کنند، بنابراین شما باید فقط نحو آنها را حفظ کنید. ممکن است عاداتی از زبان های دیگر داشته باشید که در آن شروع به تکرار دستی روی یک مجموعه می کنید، جایی که در پایتون فقط باید از for/in استفاده کنید.

همچنین می توانید از for/in برای کار بر روی یک رشته استفاده کنید. رشته مانند لیستی از کاراکترهای خود عمل می کند، بنابراین for ch in s: print(ch) همه کاراکترها را در یک رشته چاپ می کند.

محدوده

تابع range(n) اعداد 0، 1، ... n-1 را به دست می دهد، و محدوده (a، b) a، a+1، ... b-1 -- تا اما بدون احتساب آخرین عدد . ترکیبی از for-loop و تابع range() به شما این امکان را می دهد که یک عدد سنتی برای حلقه بسازید:

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

یک نوع xrange() وجود دارد که از هزینه ساخت کل لیست برای موارد حساس به عملکرد جلوگیری می کند (در پایتون 3، range() رفتار عملکرد خوبی خواهد داشت و می توانید xrange() را فراموش کنید).

در حالی که حلقه

پایتون همچنین دارای حلقه while استاندارد است و دستورات *break* و *continue* مانند C++ و Java کار می کنند و مسیر درونی ترین حلقه را تغییر می دهند. حلقه های for/in بالا، حالت رایج تکرار روی هر عنصر در لیست را حل می کند، اما حلقه while به شما کنترل کامل بر اعداد فهرست را می دهد. در اینجا یک حلقه while وجود دارد که به هر عنصر سوم در لیست دسترسی دارد:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

فهرست روش ها

در اینجا برخی از روش های رایج لیست دیگر وجود دارد.

  • list.append(elem) -- یک عنصر را به انتهای لیست اضافه می کند. خطای رایج: لیست جدید را بر نمی گرداند، فقط نسخه اصلی را تغییر می دهد.
  • list.insert(index, elem) -- عنصر را در نمایه داده شده وارد می کند و عناصر را به راست منتقل می کند.
  • list.extend(list2) عناصر موجود در list2 را به انتهای لیست اضافه می کند. استفاده از + یا += در یک لیست شبیه به استفاده از extension() است.
  • list.index(elem) -- عنصر داده شده را از ابتدای لیست جستجو می کند و فهرست آن را برمی گرداند. اگر عنصر ظاهر نشود، یک ValueError پرتاب می کند (از "in" برای بررسی بدون ValueError استفاده کنید).
  • list.remove(elem) -- اولین نمونه عنصر داده شده را جستجو می کند و آن را حذف می کند (در صورت عدم وجود ValueError را پرتاب می کند)
  • list.sort() -- لیست را در جای خود مرتب می کند (آن را بر نمی گرداند). (تابع sorted() که بعدا نشان داده شده ترجیح داده می شود.)
  • list.reverse() - لیست را در جای خود معکوس می کند (آن را بر نمی گرداند)
  • list.pop(index) -- عنصر را در نمایه داده شده حذف و برمی گرداند. در صورت حذف ایندکس، سمت راست ترین عنصر را برمی گرداند (تقریباً برعکس append()).

توجه داشته باشید که اینها *روش*ها در یک شی لیست هستند، در حالی که len() تابعی است که لیست (یا رشته یا هر چیز دیگری) را به عنوان آرگومان می گیرد.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

خطای رایج: توجه داشته باشید که روش های فوق لیست اصلاح شده را *برمی گردانند*، آنها فقط لیست اصلی را اصلاح می کنند.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

لیست ساخت

یک الگوی رایج این است که یک لیست را به عنوان لیست خالی [] شروع کنید، سپس از append() یا extension() برای اضافه کردن عناصر به آن استفاده کنید:

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

لیست برش ها

برش ها روی لیست ها درست مانند رشته ها کار می کنند و همچنین می توانند برای تغییر قسمت های فرعی لیست استفاده شوند.

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

تمرین: list1.py

برای تمرین مطالب در این بخش، مشکلات موجود در list1.py را که از مرتب‌سازی استفاده نمی‌کنند (در تمرین‌های پایه ) امتحان کنید.