مقدمه معکوس کردن آرایه در پایتون
اگر با زبانهای برنامه نویسی دیگری مثل C و ++C یا جاوا آشنا باشید حتماً میدانید که ساختار داده یا آرایه داخلی چیست. این زبانهای برنامه نویسی مقدار حافظه مورد نیاز را تعیین کرده و امکان اعلام و ایجاد آرایه را فراهم میکنند. جالب است بدانید که پایتون آرایه داخلی ندارد اما به جای آن میتوان از لیست داده استفاده کرد. آرایهها و لیستها تفاوتهایی با یکدیگر دارند. آرایهها دارای تعداد مشخصی از عناصر و داده هستند.
به صورت کلی میتوان گفت که لیست (List) نوعی آرایه در پایتون است؛ به این صورت که طول آرایه متغیر بوده و عناصر آن میتواند از انواع مختلف دادهای باشد. آرایه در زبان برنامه نویسی برای ذخیره دادههای عددی استفاده میشود. به زبان ساده مجموعهای از دادهها و اطلاعات که از یک نوع جنس و تعداد ثابت هستند، آرایه نام دارد.
نمره دانشجویان یک کلاس با یک رشته تحصیلی همگی از نوع double و یا اسامی دانش آموزان یک کلاس از نوع string هستند. از لیست (List) هم برای ذخیره داده استفاده میشود؛ اما بهتر است زمانی که حجم عناصر و دادههای عددی زیاد است به جای لیست از آرایه استفاده شود و دلیل آن ذخیره اطلاعات به صورت فشرده توسط آرایه ها است.
برعکس Listهای پایتون، آرایهها نمیتوانند به صورت مستقیم ساخته شوند و نیازمند یک کتابخانه خارجی هستند تا ایمپورت شوند. در پایتون برای استفاده از آرایه دو راه وجود دارد: استفاده از آرایه پکیج numpy یا استفاده از آرایه کتابخانه استاندارد پایتون. آرایه numpy بیشتر برای عملیاتهای ریاضی بر روی دادههای عددی کاربرد دارد و همچنین اجازه ساخت آرایههای چند بعدی را نیز به برنامه نویس میدهد. امکانات کتابخانه استاندارد پایتون نسبت به آرایه numpy کمتر است.
ساخت آرایه در پایتون
اولین راه برای ساخت آرایه در پایتون مشخص کردن نوع عددی است که قرار است آن را ذخیره کنید. در پایتون سه نوع عددی به نامهای int، double و float وجود دارد. دستور یا همان سینتکس ساخت آرایه در پایتون به صورت زیر است:
import array a = array.array('Type Code', ['numbers'])
برای درک کامل به این مثال که یک آرایه با اعداد integer ساخته شده است دقت کنید:
>>> a = array.array('i', [3, 5, 7, 9]) >>> a array('i', [3, 5, 7, 9])
به این نکته نیز دقت کنید که اعدادی که در آرایه ذخیره میشود باید با نوع مشخص شده آن همخوانی داشته باشد. یعنی اگر در مثال بالا از اعداد اعشاری استفاده میکردیم پایتون پیغام خطا ارسال میکرد:
>>> a = array.array('i', [3, 5, 7.1, 9]) >>> a TypeError: integer argument expected, got float
معکوس کردن آرایه
در ادامه مطلب ابتدا معنی معکوس کردن آرایه توضیح داده خواهد شد. معکوس یک آرایه به این معنی است که ترتیب عناصر آرایه تغییر داده میشود. با این تکنیک آخرین عنصر آرایه را به اولین عنصر معکوس میکند و اولین داده به آخرین داده تبدیل میشود. این روند تا زمانی ادامه مییابد که همه کاراکترها یا عناصر آرایه کاملاً معکوس شوند. به عنوان مثال: [۱،۲،۳،۴] => [4،۳،۲،۱]. حالا به شکل زیر نگاه کنید که معکوس آرایه به صورت کامل مشخص شده است.
معکوس کردن یک آرایه یکی از توابع اساسی و مهم در زمان برنامه نویسی است که زبان برنامه نویسی پایتون این کار را در روشهای مختلف و به صورت آسان در اختیار برنامه نویس قرار میدهد. توضیح داده خواهد شد که چگونه یک آرایه را در پایتون فراخوانی کنید.
از آنجایی که پایتون آرایههای داخلی را ارائه نمیدهد، باید از ماژول برای فراخوانی آرایه استفاده کرد. ماژولهای پایتون همان فایلهای .py هستند که تشکیل شده از کد پایتون هستند. تعدادی از ماژولها به وسیله کتابخانه استاندارد پایتون در دسترس قرار میگیرند و به محض اینکه پایتون را نصب کردید، ماژولها نیز نصب میشوند. بقیه موارد را میتوانید با pip manager پایتون نصب کنید.
#import the array module import array as arr #initializing array with integers a = arr.array('i', [1,2,3,4,5]) print('The array is: ',a)
برای تعریف آرایه، باید نوع دادهای را که ذخیره میکند نیز اعلام کنیم. همانطور که در اینجا اعداد صحیح با “i” مشخص شدهاند.
خروجی به شکل زیر خواهد بود:
The array is: array('i', [1, 2, 3, 4, 5])
در ادامه مطلب به معکوس کردن آرایه در پایتون میپردازیم.
معکوس کردن آرایه در پایتون
در زبان برنامه نویسی پایتون روشهای زیادی وجود دارد که برنامه نویس میتواند برای معکوس کردن یک آرایه استفاده کند. انتخاب روشی که با کد برنامه شما سازگار باشد، از خطا جلوگیری و در زمان صرفه جویی کند، بسیار مهم است. ۵ روش مختلف برای معکوس کردن آرایه در پایتون توضیح داده میشود. دقت کنید که در این پست از آرایهها صحبت میشود نه Listها!
روش ۱: جا به جایی عناصر
اولین روش در معکوس کردن آرایه در پایتون را بدون استفاده از تابع داخلی شروع میکنیم. رایجترین و سادهترین کاری که میتوان انجام داد این است که عناصر را در ایندکسها یا نمایههای مقابل جا به جا کنید. برای مثال به کد زیر نگاه کنید:
# import the array module import array as arr # initializing array with integers a = arr.array("i", [1, 2, 3, 4, 5]) print("The array: ", a) # get size of the array using len() method l = len(a) # going through the array only halfway!! for i in range(l // 2): # swap the elements a[i], a[l - i - 1] = a[l - i - 1], a[i] print("The reversed array: ", a)
اگر به شکل زیر توجه کنید، توضیحات داده شده و کد را به راحتی درک خواهید کرد.
The array: array('i', [1, 2, 3, 4, 5]) The reversed array: array('i', [5, 4, 3, 2, 1])
روش ۲: استفاده از متد ()reverse
به سراغ روش دوم میرویم. برای معکوس کردن یک آرایه در پایتون میتوان از متد ()reverse به طور مستقیم در هر دو لیست و آرایه استفاده کنید. برنامهنویس میتواند از متد ()reverse زمانی استفاده کند که محدودیت فضای حافظه وجود دارد، چون کد به صورتی نوشته میشود که عملیات را روی همان حافظه انجام میدهد و به فضای اضافی نیاز ندارد. در روش اول دیدید که چگونه عناصر موجود را بدون هیچ حافظه اضافی جا به جا و تعویض کردیم. متد ()reverse نیز مشابه همین کار را انجام میدهد.
روش دوم یکی از سریعترین روشها برای معکوس کردن آرایه در پایتون است. این روش برای آرایههای با طول بلند نیز استفاده میشود. متد ()reverse بر روی آرایه فراخوانی میشود یعنی به عنوان شیء که یک متد را فراخوانی میکند. اگر به مثال زیر نگاه کنید بهتر متوجه منظورمان خواهید شد.
# import the array module import array as arr # initializing array with integers a = arr.array("i", [1, 2, 3, 4, 5]) print("The array: ", a) #calling reverse() method on array a a.reverse() print("The reversed array: ", a)
خروجی به شکل زیر میباشد:
The array: array('i', [1, 2, 3, 4, 5]) The reversed array: array('i', [5, 4, 3, 2, 1])
روش ۳: استفاده از متد () reversed
روش سوم برای معکوس کردن آرایه، استفاده از متد ()reversed است که اصلاً از آرایه کپی ایجاد نمیکند و در آرایه اصلی تغییری ایجاد نمیشود اما به جای آن تکرار کننده (Iterator) برمی گرداند. این روش برای راحتی در تکرار معکوس روی دنبالهها استفاده میشود. تکرارکننده یک شیء است که شامل تعدادی مقدار و قابل پیمایش است؛ یعنی تمام مقادیر خود را تک تک میتواند برگرداند. پروتکل تکرارگر شامل متدهای ()__iter__ و ()__next__ میباشد. برای مثال به کد زیر توجه کنید:
# import the array module import array as arr # initializing array with integers a = arr.array("i", [1, 2, 3, 4, 5]) print("The array: ", a) #passing the array in reversed() reversed(a) print("The reversed array: ", a)
خروجی به شکل زیر خواهد بود:
The array: array('i', [1, 2, 3, 4, 5]) The reversed array: array('i', [1, 2, 3, 4, 5])
همانطور که میبینید تغییری در آرایه اصلی به وجود نیامد. در مثال دیگری میخواهیم reversed(arrayName) را در متغیر دیگری ذخیره کنیم:
# import the array module import array as arr # initializing array with integers a = arr.array("i", [1, 2, 3, 4, 5]) print("The array: ", a) #passing the array in reversed() reversed_a = reversed(a) print("The reversed array: ", reversed_a)
خروجی برنامه به این صورت است:
The array: array('i', [1, 2, 3, 4, 5]) The reversed array: <reversed object at 0x0000025EC428EC88>
با مثال بالا دیدید که متد ()reversed یک تکرار کننده را برمیگرداند تا ذخیره و چاپ شود. برای به دست آوردن لیست معکوس، یعنی یک کپی از معکوس آرایه اصلی، باید() list را روی متغیر reversed_a اعمال کرد. یعنی باید تکرار کننده را به یک لیست تبدیل کنید تا آرایه معکوس را بدست آورید.
# import the array module import array as arr # initializing array with integers a = arr.array("i", [1, 2, 3, 4, 5]) print("The array: ", a) #passing the array in reversed() reversed_a = list(reversed(a)) print("The reversed array: ", reversed_a)
خروجی:
The array: array('i', [1, 2, 3, 4, 5]) The reversed array: [5, 4, 3, 2, 1]
دیدید که آرایه معکوس در reversed_a ذخیره شد و به این ترتیب معکوس آرایه را به دست آوردیم. حتماً از خود می پرسید که تفاوت بین متد ()reverse و ()reversed چیست. آیا تفاوت در یک ‘d’ است؟ باید گفت اگرچه ()reverse و ()reversed کار یک تابع را انجام میدهند، اما تفاوتهایی دارند.
()reverse بدون مصرف فضای اضافی حافظه روی آرایه کار می کند اما ()reversed به آرایه جدید برای ذخیره یک کپی از آرایه معکوس نیاز دارد. همچنین، ()reverse فقط آرایه اصلی را معکوس میکند، اما ()reversed روی آرایه اصلی تأثیر ندارد و با برگرداندن یک تکرارگر روی دنباله، آن را معکوس میکند. به این نکته هم توجه داشته باشید، از آنجایی که ()reversed یک تکرار کننده را برمیگرداند، فقط با اشیاء متوالی کار میکند.
روش ۴: استفاده از عملیات Slicing
روش چهارم استفاده از عمل Slid برای معکوس کردن آرایه است و هیچ تاثیری روی آرایه اصلی ندارد و یک کپی معکوس از آرایه اصلی برمیگرداند. حالا برویم به سراغ اینکه چگونه عملیات Slincing را روی آرایه انجام دهیم؟ Slicing فرآیند انتخاب یا فراخوانی بخشی از آرایه با توجه به شاخصهای آغاز و پایان است. برای برش یا Slice یک آرایه، انجام دستورات زیر لازم است:
arrayName[start: end: step] -1
در اینجا، start نمایانگر شاخص شروع آرایه برش شده شما است. end نمایانگر شاخص پایانی آرایه برش خورده است. step یک پارامتر اختیاری است که معمولاً در مواقعی استفاده میشود که لازم است چند عنصر را در برش خود نادیده بگیرید. برای معکوس کردن آرایه، پارامتر step نقش مهمی ایفا میکند.
به عنوان مثال، میخواهیم عملیات Slice را روی این آرایه انجام دهیم. آرایه a = [1، ۲، ۳، ۴] را در نظر بگیرید:
۱. از شروع = 0 تا پایان = 2 => a[:3]
۲. از شروع = 2 تا بقیه آرایه => a[2:]
۳. از شروع = 1 تا بقیه آرایه، از عنصر بعدی پرش => a[1::1]
برای درک Slicing باید به شاخص آرایه توجه کنید. در زبان پایتون، شاخص آرایه را با اعداد منفی نشان میدهند، جایی که انتهای آرایه با ۱- مشخص شده است. دستور slice یا برش برای معکوس کردن آرایه در پایتون به صورت زیر است: arrayName[::-1]
از آنجایی که شاخص شروع یک آرایه، به طور پیشفرض، ۰ است. بنابراین، با اضافه کردن (۱-) به ۰، به ۱- میرسید، یعنی آخرین شاخص آرایه. با افزودن (۱-) به (۱-) به (۲-) منجر می شود که دومین شاخص آخر آرایه است. این کار تا رسیدن به آخرین یا همان (اولین) اندیس آرایه ادامه می یابد. مثال زیر گویای مطالب گفته شده است:
# import the array module import array #function to reverse the array def reversingArray(a): return a[::-1] # declare an array a = array.array("i", [1, 2, 3, 4, 5]) print('The original array is: ', a) print('The reversed array is ',reversingArray(a)) reversingArray(a) #The above statment won't work. Can you guess, why? print(a)
توجه داشته باشید که دستور reversingArray(a) خطا میدهد، زیرا آرایه را در تابع خود برمیگردانیم، اما متغیری را برای ذخیره خروجی اختصاص نداده ایم. خروجی کد بالا به شکل زیر است:
The original array is: array('i', [1, 2, 3, 4, 5]) The reversed array is array('i', [5, 4, 3, 2, 1]) array('i', [1, 2, 3, 4, 5])
روش ۵: استفاده از تابع Recursion
استفاده از تابع بازگشتی نیز یکی از راههای معکوس کردن آرایه در پایتون، بدون استفاده از توابع داخلی است. هنگامی که در حین اجرا، تابعی خود را فراخوانی میکند، به آن بازگشتی میگویند. برای اینکه تابع بازگشتی منجر به یک حلقه یا اجرا بی نهایت نشود، لازم است یک شرط پایانی در تابع اضافه شود. برای معکوس کردن یک آرایه در پایتون با استفاده از روش بازگشتی، به کد زیر نگاه کنید:
#import array module import array #function to reverse array def reverseArray(arr): if len(arr) == 1: return arr #print(arr) ->You can uncomment this to know how recursion works return reverseArray(arr[1:]) + arr[0:1] #declaring array a = array.array('i', [10, 20, 30, 40, 50]) print("The original array: ", a) print('The reversed array is: ',reverseArray(a)) #declaring an array with lenght = 1 b = array.array('i', [1]) print('Original array: ', b) print('The reversed array: ', reverseArray(b))
برای اینکه بدانید روش بازگشتی چگونه انجام می شود و چگونه آرایه را در پایتون معکوس میکند، می توانید دستور چاپ در تابع را حذف کنید. شرط if بالا عبارت پایان دهنده است. لازم است یک شرط اضافه کنید، در غیر این صورت عملکرد توابع بازگشتی را متوقف نمیکند و منجر به خطا میشود.
خروجی:
The original array: array('i', [10, 20, 30, 40, 50]) The reversed array is: array('i', [50, 40, 30, 20, 10]) Original array: array('i', [1]) The reversed array: array('i', [1])
در این بخش حل مسئله فروشنده دوره گرد با الگوریتم SA در پایتون قرار داده شده است. مسئله فروشنده دوره گرد از جمله مسائل ریاضیات میباشد که قابل حل به روشهای مختلفی است. برای دسترسی به این فایل به لینک زیر مراجعه کنید.
سخن آخر در معکوس کردن آرایه در پایتون
استفاده از روشهای Slicing و ()reverse ساده ترین راه برای معکوس کردن آرایه در پایتون است. روشهای گفته شده برای آرایههایی که با استفاده از ماژول آرایه در پایتون ایجاد شدهاند مناسب هستند. امیدواریم مطالب گفته شده مفید بوده باشد. اگر سوالی در مورد مطالب گفته شده برایتان پیش آمد، در بخش نظرات میتوانید مطرح کنید. موفق و پیروز باشید.