مشخصات مقاله
-
721
-
0.0
-
5504
-
0
-
0
انواع ساختار داده در پایتون
آموزش ساختار های داده در برنامه نویسی پایتون
این بخش چیزهایی را که تاکنون فرا گرفته اید، با جزییات بیشتر توضیح میدهد و چیزهای جدیدتری را نیز به آن اضافه می کند.
اطلاعات بیشتر درباره لیست ها در Python
نوع داده لیست متدهای بیشتری دارد. در اینجا همه متدهای اشیای لیست ارائه شده است.
List.append(x) در Python
یک عنصر را به انتهای لیست اضافه می کند. برابر است با a[len(a):] = [x] .
List.extend(itarable) در Python
با الحاق همه عناصر iterable ، لیست را توسعه می دهد. برابر است با a[len(a):] = iterable .
List.insert(I,x) در Python
یک عنصر را در مکان داده شده درج می کند. آرگومان اول، اندیس عنصری است که عنصر جدید قبل از آن باید درج شود، بنابراین a.insert(0, x) در ابتدای لیست درج می کند و a.insert(len(a), x) برابر است با a.append(x).
List.remove(x) در Python
اولین عنصر لیست که دارای مقدار x باشد را از لیست حذف می کند. اگر چنین عنصری وجود نداشته باشد خطای ValueError بروز می کند.
List.pop([i]) در Python
عنصر موجود در مکان داده شده را از لیست حذف می کند و آن را باز می گرداند. اگر هیچ اندیسی مشخص نشده باشد، a.pop() آخرین عنصر لیست را حذف می کند و باز می گرداند. ( وجود براکت مربعی [] در اطراف i در نحوه نگارش متد، بیانگر این است که استفاده از پارامتر، اختیاری است و مجبور به نوشتن براکت ها در این مکان نیستید. در مراجع کتابخانه پایتون این نوع نوشتار را مکررا می بینید.)
List.clear() در Python
تمامی عناصر لیست را حذف می کند. برابر است با del a[:]
List.index(x[, start[, end]]) در Python
اندیس مبتنی بر صفر در لیست اولین آیتم که مقدار برابر با x دارد را باز می گرداند. اگر چنین آیتمی وجود نداشته باشد خطای ValueError را بر می انگیزد. آرگومان های اختیاری شروع و پایان همانطور که در نحوه نگارش آمده تفسیر می شود و برای محدود کردن جستجو به یک زیر مجموعه خاص از لیست استفاده می شود. اندیس باز گردانده شده متناسب با شروع کل دنباله محاسبه می شود نه از آرگومان شروع.
List.count(x) در Python
تعداد دفعات ظهورx در لیست را باز می گرداند.
List.sort(key=None, reverse=False) در Python
عناصر درون لیست را مرتب می کند ( آرگومان ها برای سفارشی کردن مرتب سازی می توانند بکار روند
List.reverse() در Python
عناصر لیست را برعکس می کند.
List.copy() در Python
یک کپی از لیست را باز می گرداند. برابر است با a[:].
یک مثال که بیشتر متدهای لیست را استفاده می کند در ادامه آمده است:
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
>>> fruits.count('apple')
2
>>> fruits.count('tangerine')
0
>>> fruits.index('banana')
3
>>> fruits.index('banana', 4) # Find next banana starting a position 4
6
>>> fruits.reverse()
>>> fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']
>>> fruits.append('grape')
>>> fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']
>>> fruits.sort()
>>> fruits
['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']
>>> fruits.pop()
'pear'
ممکن است متوجه شده باشید متدهایی مانند insert، remove و sort که فقط لیست را تغییر می دهند، هیچ مقدار بازگشتی را چاپ نمی کند – آنها مقدار پیش فرض none را باز می گردانند. 1 این یک قانون طراحی برای ساختارهای داده قابل تغییر در پایتون است. مورد دیگر که ممکن است متوجه شده باشید این است که همه داده ها نمی توانند مرتب یا مقایسه شوند.
برای مثال [None, 'hello', 10] مرتب نمی شود زیرا اعداد صحیح قابل مقایسه با رشته نیست و None با سایر انواع قابل مقایسه نیست. همچنین، برخی انواع وجود دارد که رابطه ترتیبی تعریف شده ندارند. برای مثال، 3+4j < 5+7j یک مقایسه معتبر نیست.
استفاده از لیست ها به عنوان پشته در Python
: متدهای لیست امکان استفاده از یک لیست به عنوان پشته( که آخرین عنصر اضافه شده، اولین عنصر بازیابی شده است- last-in, first-out) را بسیار آسان کرده است. برای اضافه کردن یک عنصر به بالای پشته از append() استفاده کنید. برای بازیابی یک عنصر از بالای پشته از pop() بدون اندیس صریح استفاده کنید. برای مثال:
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
استفاده از لیست ها به عنوان صف در پایتون
همچنین استفاده از لیست به عنوان صف (که اولین عنصر اضافه شده، اولین عنصر بازیابی شده است - first-in, first-out) نیز امکان پذیر است.
هرچند استفاده از لیست با این هدف کارآمد نیست. درحالی که اضافه کردن و برداشتن (append - pop) از انتهای لیست سریع است، درج و برداشتن (insert - pop) از ابتدای لیست کند است (زیرا تمامی عناصر دیگر باید یک واحد جا به جا شوند). برای ساخت صف، از collections.deque استفاده کنید که برای داشتن یک روند افزودن و برداشت (append - pop) سریع از هر دو سر طراحی شده است. برای مثال:
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
درک مباحث لیست (list comprehensions)در برنامه نویسی پایتون
درک مباحث لیست راه کوتاهی برای ساخت لیست ها فراهم می کند. برنامه های کاربردی متداول، لیست های جدیدی ایجاد می کنند که هر عنصر آن نتیجه اعمال تعدادی عملیات روی هر عضو از دنباله دیگر یا iterable است، یا زیر دنباله هایی از آن عناصر ایجاد می کند که شرایط خاصی را برآورده می کند. برای مثال، فرض کنید می خواهیم لیستی از مربع(اعداد) ایجاد کنیم:
>>> squares = []
>>> for x in range(10):
... squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
توجه داشته باشید این کد یک متغیر به نام x می سازد (یا باز نویسی می کند) که پس از اتمام حلقه همچنان وجود دارد. می توان لیست مربع ها را بدون هیچ اثر جانبی به صورت زیر محاسبه کرد:
squares = list(map(lambda x: x**2, range(10)))
یا به صورت مشابه زیر که مختصر تر و خوانا تر است:
squares = [x**2 for x in range(10)]
یک درک مطلب لیست شامل براکت هایی است که در برگیرنده یک عبارت است که در ادامه آن یک for و سپس تعدادی (صفر یا بیشتر) بسته if یا for قرار دارد. نتیجه، یک لیست جدید خواهد بود که از ارزیابی عبارت موجود در متن بسته for یا if که پس از آن قرار دارد ، به دست می آید. برای مثال، این listcomp در صورت عدم تساوی عناصر دو لیست را با هم ترکیب می کند:
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
و برابر است با:
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
توجه کنید که ترتیب عبارات در for و if در هر دو قطعه کد مشابه است. اگر عبارت یک tuple باشد (برای مثال (x, y) در مثال قبل)، باید پرانتز گذاری شود.
>>> vec = [-4, -2, 0, 2, 4]
>>> # create a new list with the values doubled
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # call a method on each element
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # the tuple must be parenthesized, otherwise an error is raised
>>> [x, x**2 for x in range(6)]
File "", line 1, in
[x, x**2 for x in range(6)]
^
SyntaxError: invalid syntax
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
درک مباحث لیست می تواند شامل عبارات پیچیده و توابع تو در تو باشد:
>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
درک مباحث لیست تو در تو در برنامه نویسی پایتون
عبارت اولیه در یک درک مطلب لیست می تواند هر عبارت دلخواهی از جمله یک درک مطلب لیست دیگر باشد. مثال زیر را در نظر بگیرید. یک ماتریس 4*3 است که به صورت یک لیست ، شامل سه لیست به طول 4 پیاده سازی شده است.
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
درک مطلب لیست زیر سطرها و ستون ها را جا به جا می کند:
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
همانطور که در بخش قبل دیدیم، listcomp تو در تو، در متن بسته for که پس از آن می آید ارزیابی می شود، بنابراین این مثال برابر است با:
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
که مشابه است با:
>>> transposed = []
>>> for i in range(4):
... # the following 3 lines implement the nested listcomp
... transposed_row = []
... for row in matrix:
... transposed_row.append(row[i])
... transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
در دنیای واقعی، باید توابع داخلی را برای ترکیب عبارات روند (کد) ترجیح دهید. تابع zip() برای این مورد بسیار خوب عمل می کند.
>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]