از مجموعه در پایتون برای نگهداری دادهها استفاده میشود. مجموعه یا set یک نوع دادهای مشابه لیست است که میتواند دادههای از یک نوع یا نوعهای مختلف را درون خود نگه دارد. دو تفاوت اصلی مجموعهها، عدم ترتیب عناصر و غیر تکراری بودن اعضای آن است. در این آموزش با مجموعهها و ترفندهای کار با مجموعه پایتون آشنا خواهید شد.
اگر بخواهم مجموعههای پایتون (python set) را خیلی ساده معرفی کنم، شما را به نظریه مجموعهها در ریاضی ارجاع میدهم! مطمئناً در درس ریاضی با مجموعهها آشنا شدهاید. اگر هم الآن حضور ذهن ندارید، جای هیچ نگرانی نیست.
در مجموعهها گروهی از عناصر را نگهداری میکنیم. میتوان به هر مجموعه اعضای جدید اضافه کرد یا اعضای قبلی را حذف کرد ولی اعضای موجود را نمیتوان تغییر داد. همچنین بین دو مجموعه عملگرهای مختلفی تعریف میشوند؛ عملگرهایی نظیر اجتماع، اشتراک، تفاضل.
در برنامهنویسی پایتون نیز از مجموعهها دقیقاً به همین منظور استفاده میشود. ابتدا با ویژگیهای set در پایتون آشنا شده و نحوه تعریف آن را یاد میگیریم. سپس توابع اصلی کار با مجموعه را معرفی خواهم کرد.
برای عضویت در دوره ویدئویی میتونید به «دوره جامع پایتون در کالج» مراجعه کنید. با ثبتنام رایگان در دوره، به تمام جلسات اصلی، جلسات تکمیلی، تمرینها، آزمونها و منابع مازاد دسترسی کامل خواهید داشت.
فهرست محتوای آموزش
مجموعه در پایتون
set یک ساختمان داده built-in است.اعضای یک مجموعه پایتون دارای سه ویژگی اصلی زیر هستند:
- نامرتب (unordered)
- غیرقابل تغییر (unchangeable)
- غیر تکراری (non-duplicate)
منظور از نامرتب بودن این است که نمیتوان ترتیب خاصی برای عناصر درون مجموعه در نظر گرفت. علاوه بر این، مجموعه برخلاف لیست در پایتون دارای اندیس (ایندکس) نیستند. در نتیجه نمیتوان به یکی از اعضای آن به وسیله اندیس دسترسی داشت.
اعضای یک مجموعه غیر قابل تغییر هستند؛ بنابراین نمیتوان یک مقدار را تغییر داد. در حقیقت چون نمیتوانیم به یک عنصر مشخص دسترسی داشته باشیم، نمیتوانیم آن را تغییر دهیم.
همه اعضای یک مجموعه در پایتون به صورت یکتا هستند. یعنی هیچ دو عضوی از یک مجموعه وجود ندارد که با هم برابر باشند. در جلوتر میبینیم که اگر در هنگام تعریف مجموعه سعی کنیم مقادیر تکراری داشته باشیم، به صورت خودکار فقط یکی از آنها باقی میماند.
تعریف مجموعه پایتون
دو نوع ساختار تعریف برای set در پایتون داریم. زمانی از اولین حالت استفاده میکنیم که حداقل یک مقدار از مجموعه را در اختیار داشته باشیم. برای تعریف مجموعه، از علامت آکولاد استفاده میشود. با {
مجموعه را شروع کرده و با }
خاتمه میدهیم. هر عضو در مجموعه نیز با استفاده از کاما (,
) از یکدیگر جدا میشوند.
num_set = {17, 81, 4, 11}
str_set = {"Negar", "Omid", "Ehsan"}
برای تعریف مجموعه نمیتوانیم به طور تنها از علامت {}
استفاده کنیم. برعکس لیستها که با گذاشتن []
هم تعریف میشدند، اگر فقط از آکولاد استفاده کنیم، یک دیکشنری پایتونی خواهیم داشت. به کد زیر دقت کنید:
my_set = {17, 81, 4, 11}
print( type(my_set) ) # <class 'set'>
test = {}
print( type(test) ) # <class 'dict'>
روش دوم برای تعریف مجموعه در پایتون استفاده از سازنده set()
است. با صدا زدن این تابع، یک مجموعه خالی ایجاد میشود که به کمک توابعی که در قسمت بعدی میبینیم خواهیم توانست مقادیر جدیدی به آن اضافه کنیم.
X = set()
تابع set()
میتواند به عنوان ورودی یک مجموعه داده تکرارگر یا iterator در پایتون دریافت کند. دادههای تکرارگر دادههایی هستند که قابل پیمایش هستند. بنابراین میتوانیم یک لیست، تاپل یا رشته را به عنوان ورودی این تابع داده و آن را به مجموعه تبدیل کنیم.
lst = ["Shiraz", "Tehran", "Tabriz", "Mashhad"]
cities = set(lst)
print(cities)
# outpuut:
# {'Mashhad', 'Tabriz', 'Tehran', 'Shiraz'}
میتوان به جای لیست، یک رشته متنی را به set()
داده و مجموعهای از کاراکترهای یکتای رشته مورد نظر را دریافت کنیم.
site_name = "SabzDanesh.com"
site_chars = set(site_name)
print(site_chars)
# output:
# {'s', 'h', 'z', 'D', 'n', 'e', 'c', 'S', '.', 'a', 'o', 'm', 'b'}
دقت کنید که در مثال بالا، برخی از کاراکترها مثل s که چندین بار در رشته به کار گرفته شدهاند، فقط یک بار در مجموعه قرار میگیرند.
یادآوری میکنم که ویژگیهای اصلی مجموعه در پایتون (Python Set) نامرتب بودن، غیرتکراری بودن و غیر قابل تغییر بودن اعضای مجموعه است. این نوع دادهای مبتنی بر ساختمان داده جدول هش (Hash Table) است.
کار با مجموعههای پایتون
دادههایی که در یک مجموعه قرار میدهیم میتوانند از یک نوع یا نوعهای مختلف باشند. برای مثال در قطعه کد زیر میبینید که سه set مختلف با دادههای متنوع ایجاد شده است.
my_set1 = {6, 17, 28}
my_set2 = {"omid", 2557, "sabzdanesh", (2,5)}
my_set3 = {2.4, "Hello", (4,7,9)}
گفتم که اعضای مجموعه در پایتون تغییر ناپذیر (immutable) هستند. به این معنی که مقدار یک عنصر را در مجموعه نمیتوان تغییر داد. اما توجه کنید که set در پایتون تغییر پذیر است. یعنی میتوانیم اعضای جدیدی به آن اضافه کرده یا برخی از اعضا را حذف کنیم. در ادامه با توابعی آشنا میشویم که چنین کارهایی انجام خواهند داد.
یادآور میشوم که نمیتوانیم به طور مستقیم و از طریق index به اعضای موجود در مجموعه دسترسی داشته باشیم.
معمولاً یکی از کارهایی که با دادههای مجموعهای انجام میدهیم، محاسبه اندازه آنهاست. منظور از اندازه، تعداد اعضای درون یک مجموعه است. برای محاسبه اندازه مجموعه در پایتون از تابع len()
استفاده میکنیم.
فقط کافی است set را به عنوان ورودی به این تابع بدهیم تا تعداد اعضای مجموعه را داشته باشیم.
city_set = {"Shiraz", "Tehran", "Tabriz", "Mashhad", "Isfahan"}
print( len(city_set) )
# output:
# 5
بررسی موجود بودن عضو set
یکی از کارهای متداول دیگری که با مجموعهها انجام میدهیم، بررسی وجود یک مقدار در مجموعه است. این فرآیند معمولاً در دستورات شرطی پایتون و برای گرفتن یک تصمیم انجام میشود.
برای اینکه وجود یک مقدار در set را بررسی کنیم، از کلمه کلیدی in استفاده میکنیم. به مثال زیر توجه کنید:
print( "Shiraz" in city_set )
# output:
# True
test_set = {1, 2, 3, 5, 8}
if 7 in test_set:
print("Yes!")
else:
print("No!")
در قسمت دوم این کد، پس از تعریف مجموعه test_set، در یک شرط if بررسی کردهایم که آیا مقدار 7 در مجموعه قرار دارد یا خیر. با اجرای کد، مقدار No!
چاپ میشود.
برای اینکه عدم وجود عنصر در مجموعه را بررسی کنیم، از عبارت not in استفاده خواهیم کرد. در قطعه کد زیر، عدم وجود nazanin در مجموعه را بررسی کردهایم:
names_set = {"negar", "omid", "roya", "ehsan", "roya"}
if "nazanin" not in names_set:
print("OK!")
افزودن عضو به مجموعه
گفتیم برخلاف عناصر مجموعه، خود مجموعهها قابل تغییر هستند. برای افزودن یک عضو جدید به مجموعه در پایتون از متد add()
استفاده میکنیم. این متد به صورت تابعی روی نوع داده مجموعه تعریف شده است.
بنابراین برای استفاده از آن، باید متد را روی مجموعه مورد نظر صدا بزنیم. این متد یک ورودی میگیرد که مقدار عنصر جدید را مشخص میکند.
test_set.add(11) # {1, 2, 3, 5, 8, 11}
گاهی نیاز داریم چند عضو جدید را از یک لیست به مجموعه خود اضافه کنیم. روش اول استفاده از یک حلقه for برای افزودن همه عناصر list به set است.
روش دوم و بهتر، استفاده از متد update()
است. این متد یک لیست را به عنوان ورودی گرفته و تمام اعضای آن را به مجموعه ما اضافه میکند.
new_nums = [9, 15, 13]
test_set.update(new_nums)
print( test_set )
# {1, 2, 3, 5, 8, 9, 11, 13, 15}
حذف از set پایتون
برای حذف یک عنصر از مجموعه در پایتون از متدهای discard()
و remove()
استفاده میشود. این دو متد یک مقدار را به عنوان ورودی گرفته و از درون مجموعه مورد نظر ما حذف میکنند.
این دو متد تنها یک تفاوت با هم دارند: اگر مقدار مورد نظر در مجموعه وجود نداشته باشد، discard()
هیچ کار خاصی انجام نمیدهد اما remove()
خطا (error) میدهد.
test_set.remove(8)
# {1, 2, 3, 5, 9, 11, 13, 15}
test_set.remove(7) # Error!
test_set.discard(7)
# {1, 2, 3, 5, 9, 11, 13, 15}
عملگرهای مجموعه در پایتون
اگر از درس ریاضی به خاطر داشته باشید، بین مجموعهها عملیاتهای مختلفی انجام میدادیم. گاهی لازم است برخی از آن کارها را در پایتون هم انجام دهیم. در ادامه ۳ عملگر پر استفاده را بررسی میکنیم.
در این جا برای درک سادهتر مثالها، از عناصر عددی استفاده میکنم. اما نوعهای دادهای مجموعهها هر چیزی میتوانند باشند. (بیشتر بیاموزید: کار با عدد در پایتون) دو مجموعه A و B را در نظر بگیرید:
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
اجتماع دو مجموعه (union)
اجتماع دو مجموعه عبارت است از مجموعهای از تمام اعضای هر دو مجموعه. برای اجتماعگیری روی مجموعهها در پایتون از عملگر |
یا متد union()
استفاده میشود.
عملگر |
بین دو مجموعه قرار میگیرد و مشابه عملگرهای ریاضی، نتیجه نهایی را به ما خواهد داد. متد union()
روی یکی از مجموعهها صدا زده شده و مجموعه دیگر به عنوان ورودی به آن داده میشود.
A_union_B = A | B
# A_union_B = {1, 2, 3, 4, 5, 6, 7, 8}
print( A.union(B) )
# {1, 2, 3, 4, 5, 6, 7, 8}
تفاضل دو مجموعه در پایتون
تفاضل یا تفاوت مجموعه B از A یک مجموعه از تمام اعضایی است که فقط در A قرار دارند. به عبارت دیگر اعضایی از A که در B حضور ندارند.
برای محاسبه تفاوت دو set از عملگر تفریق (-
) یا متد difference()
استفاده میشود. به مثال زیر توجه کنید:
print( A - B )
# print( A - B )
print( A.difference(B) )
# {1, 2, 3}
print( B.difference(A) )
# {8, 6, 7}
دقت کنید که در حالت عمومی مجموعه A-B برابر B-A نیست.
اشتراک مجموعه (intersection)
اشتراک دو مجموعه، مجموعهای از اعضایی است که در هر دو مجموعه حضور دارند. در صورتی که دو مجموعه هیچ عنصر مشترکی نداشته باشند، اشتراک آنها خالی (تهی) خواهد بود.
برای انجام عملیات اشتراک روی دو مجموعه در پایتون از عملگر & یا متد intersection()
استفاده میشود.
print( A & B )
# {4, 5}
print( A.intersection(B) )
# {4, 5}
اگر مایلید تمام عملگرها و متدهای قابل اجرا روی مجموعهها در پایتون را بررسی کنید، به جدول موجود در این لینک مرجع مراجعه کنید.
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام و خسته نباشید جناب.
محتوا بسیار عالی هست فقط یک سوال داشتم.
چطوری میتونیم توی یک مجموعه که اعداد و رشته های قاطی هستند از هم جدا کرد و به دو تا مجموعه دیگه تبدیل کرد.
مثلا مجموعه زیر رو :
سلام
بهطور کلی متد یا تابعی مخصوص این کار نداریم. میتونید در یک حلقه، نوع هر کدوم رو بررسی کنید و اونها رو تفکیک کنید. البته از تابع filter هم میشه کمک گرفت.
استاد بعد از کلی تحقیق و گشت گذار تو اینترنت یک راه حل پیدا کردم و کار کرد. خوشحال،میشم به اشتراک بزارم.
که این همه داده هایی که رشته هستند رو میریزه توی A و با حلقه هم x رو توی لیست گردش دادم تا یکی یکی داده ها رو چک کنه و اینکه تابع isinstanc هم تشخیص میده نوع داده رو جدا میکنه.
احسنت. مرسی که دانشت رو به اشتراک میذاری 🙂
اگه به جای str هم از int استفاده کنی، فقط اعداد صحیح رو فیلتر میکنه. روش جالبیه
بله درسته
سلام بازبان روان و همه فهم و خلاصه توضیح دادید متشکرم موفق باشید
سلام
خوشحالیم که براتون مفید بوده و این آموزش رو کاربردی میدونید علی عزیز
سلام چطوره key یک value رو صدا بزنم؟و بالعکس
سلام
منظورتون توی دیکشنری بوده یا ستها؟ ستها که کلید ندارن!
برنامه نویسا 24 ساعت به مانیتور نگاه می کنن, تم شما باید دارک باشه !
تم سایتتون رو دارک بلو کنید و لولتون رو بیارید در حد گیک فور گیکس و گیت هاب
الان که همه چی فیلتره, دور دور شماست, لطفا هر چه سریع تر از شر استایل فعلی سایتتون خلاص شید و یه چیز مشتی دیپلوی کنید شکن نکنید با محتوایی که دارید خفن ترین سایت برنامه نویسی ایران خواهید بود.
درود
ممنون بابت پیشنهادت. حتماً توی نسخه جدیدمون این مورد رو در نظر میگیریم. البته رنگ روشن یا تیره سلیقهایه ولی حتماً گزینهای برای تغییرش توسط خودتون میذاریم.
عالی هستین عاااالی
خوشحالیم که آموزشهامون رو دوست دارید و خوشحالتریم که همراهانی مثل شما داریم 🙂
سلام ممنون از اموزش خوبتون
خدا خیرتون بده
یک سوال
تابعی هست که تمام زیرمجموعه های یک مجموعه رو بده؟
سلام
خوشحالیم که آموزشمون رو دوست داشتی.
منظورت powerset یک مجموعه است؟! اگر آره، تا جایی که میدونیم تابع built-in نداریم؛ باید خودتون با کمک حلقهها این کار رو انجام بدید.
عالی دمت گرم
دمِ خودتون هم گرم که بهمون انرژی میدید!
درود
تو متنی که فرمودید :
میتوان به جای لیست، یک رشته متنی را به
set()
داده و مجموعهای از کاراکترهای یکتای رشته مورد نظر را دریافت کنیم.دقت کنید که در مثال بالا، برخی از کاراکترها مثل s که چندین بار در رشته به کار گرفته شدهاند، فقط یک بار در مجموعه قرار میگیرند.
تو این قسمت حرف تکراری a هست و حرف s چون یکیش حروف بزرگه و دیگری حروف کوچیکه ، حذف نمیشه.
بله دقیقاً همینطوره که گفتید سیامک عزیز 🙂
خیلی عالی بود مطالب سایتتون
خوشحالیم که آموزشهای سایت براتون کاربردی بوده کمند عزیز
موفق باشی
سلام خسته نباشید من یه سوال دارم اینکه میخوام به پایتون بگم مثلا عدد n رو به عنوان ورودی بگیر و اندازه این عدد متغیر از a0 تا an بساز به نظرتون چیکار باید بکنم؟
سلام
دلیل خاصی دارید که به جای استفاده از لیست یا حتی دیکشنری برای نگهداری مقادیر میخواید از متغیر جداگانه استفاده کنید؟ به نظر استفاده از یه ساختمان داده مجموعهای براتون کاربردیتر باشه.
آیا من میتونم به راحتی هر عضو را فراخوانی کنم یا مثلا عضوهای اول هرکدام از اعضا را با هم مقایسه کنم؟
بله!
علاوه بر اینکه شما میتونید به هر عضوی از داخل یک لیست یا دیکشنری دسترسی داشته باشید، میتونید از اونها در حلقه استفاده کنید و روی همگی پردازشهای خاصی انجام بدید.
پیشنهاد میکنم ابتدا جلسه لیستها و اگر نیازتون شد، جلسه دیکشنری از دوره رایگان رو ببینید تا با این ساختمان دادههای مفید آشنا بشید.
واقعا خسته نباشید که این مطالب رو به صورت رایگان و فارسی در اختیار ما قرار میدین
برای افرادی مثل ما که اطلاعات زیادی در ااین زمینه ها نداریم و تازه داریم یاد میگیریم این جور مطالب خیلی کمک کننده هست
واقعا ممنون و خسته نباشید همینجوری ادامه بدیین !!!!!!!!!!!!!!
ممنونیم میعاد عزیز به خاطر انرژی خوبی که بهمون دادی. خیلی خوشحالیم که آموزشهامون براتون مفیده. موفق باشی
سلام به تیم سبز دانش
اگر که یک دستور ساده داشته باشیم مثل این
بعد من اگر بیام با toplevel یک پنجره را باز میکنم مثلا میزارم tk حال اگر بخوام بجای روت بالا با دستور کانفیگ جای روت را با tk تغییر بدم چکار کنم؟با همون دستور itemconfig میشه اگر میشه برای مشخص کردن تغییر کردن پنجره چکار کنم
سلام
تجربهای در این مورد نداریم. طبق جستجو، متد geometry برای root رو بررسی کنید. احتمالاً با فراخوانی دوباره بتونید محل و اندازه رو تغییر بدید.
سلام یک سوال در مورد تغییر دادن رنگ نوشته های خروجی در کنسول و ماژول os داشتم اول که ما وقتی یک رنگ مثلا سبز را مشخص میکنم کل خروجی ها سبز میشن میخوام ببینم چجوری میتونم کد ها را جدا کنم که فقط متن هایی که میخوام تغییر رنگ پیدا کنه و اینکه وقتی هم از دستور پاک کردن سورس ها استفاده میکنیم قاعدتاً هر خروجی ای که قبل از دستور نوشته شده را پاک میکنه برای این هم میخوام ببینم چجوری میتونم مشخص کنم که فقط یک خروجی خاص را پاک کنه؟
سلام
کاش سؤالاتتون رو دقیقتر و مرتبط با آموزش میپرسیدید.
برای تغییر رنگ از چه کتابخونه و توابعی استفاده میکنید؟!
برای پاک کردن هم، من فقط میدونم که چطور میشه آخرین خط کنسول رو حذف کرد. با تعریف
end="\r"
در تابع پرینت پایتون وend=""
برای آخرین خط، میتونید خط آخر رو بازنویسی کنید.این عکسایی که گذاشتین واقعن کمک کنندست.
ممنونم
خوشحالم که این آموزش رو کاربردی میدونید. ممنون بابت انرژی خوبتون.