رندومایز کردن و لیستها در پایتون به همراه پروژه
در دنیای برنامهنویسی، گاهی اوقات نیاز داریم تا عناصر یک لیست را به صورت تصادفی مرتب کنیم یا از آنها به صورت تصادفی انتخاب کنیم. در این مقاله، به بررسی روشهای مختلف رندومایز کردن لیستها در پایتون میپردازیم و از ماژول random
پایتون برای این منظور استفاده میکنیم.
ماژول random
ماژول random
در پایتون، توابعی را برای تولید اعداد تصادفی در بازههای مختلف فراهم میکند. این ماژول برای ایجاد دادههای تصادفی، انتخاب تصادفی و غیره مورد استفاده قرار میگیرد.
در زیر جدولی از توابع ماژول random
در پایتون و توضیحاتی درباره آنها و مثالهایی از استفاده از آنها را میبینید:
تابع | توضیح | مثال | خروجی مثال |
---|---|---|---|
random.seed() |
مقدار اولیه یا seed را برای تولید کننده اعداد تصادفی تنظیم میکند | random.seed(2); print(random.random()) |
0.9560342718892494 |
random.getstate() |
وضعیت فعلی داخلی تولید کننده اعداد تصادفی را برمیگرداند | print(random.getstate()) |
(3, (2147483648, 507801126, 683453281, 310439348, 2597246090, … |
random.setstate() |
وضعیت داخلی تولید کننده اعداد تصادفی را بازیابی میکند | state = random.getstate(); random.setstate(state); print(random.random()) |
0.9560342718892494 |
random.getrandbits(k) |
یک عدد را که نماینده بیتهای تصادفی است برمیگرداند | print(random.getrandbits(4)) |
8 |
random.randrange(stop) |
یک عدد تصادفی در بازه [0, stop) برمیگرداند | print(random.randrange(10)) |
3 |
random.randint(a, b) |
یک عدد صحیح تصادفی در بازه [a, b] برمیگرداند | print(random.randint(1, 10)) |
7 |
random.choice(seq) |
یک عنصر تصادفی از یک دنباله را برمیگرداند | print(random.choice([1, 2, 3, 4, 5])) |
3 |
random.choices(seq, k=k) |
یک لیست با انتخاب تصادفی از یک دنباله را برمیگرداند | print(random.choices([1, 2, 3, 4, 5], k=2)) |
[4, 3] |
random.shuffle(seq) |
یک دنباله را میگیرد و دنباله را به ترتیب تصادفی برمیگرداند | my_list = [1, 2, 3, 4, 5]; random.shuffle(my_list); print(my_list) |
[3, 2, 5, 1, 4] |
random.sample(population, k) |
یک نمونه از یک دنباله را برمیگرداند | print(random.sample([1, 2, 3, 4, 5], 3)) |
[4, 1, 5] |
random.random() |
یک عدد شناور تصادفی بین 0 و 1 برمیگرداند | print(random.random()) |
0.37444887175646646 |
random.uniform(a, b) |
یک عدد شناور تصادفی بین دو پارامتر داده شده برمیگرداند | print(random.uniform(1, 10)) |
2.424073894858091 |
توجه داشته باشید که خروجیهای مثالها تصادفی هستند و ممکن است هنگام اجرای کد در محیط شما مقادیر متفاوتی برگرداند. همچنین برخی از توابع مانند random.gauss()
یا random.paretovariate()
که بر اساس توزیعهای احتمالاتی خاص کار میکنند، در این جدول آورده نشدهاند.
یک مثال ساده:
import random random_side = random.randint(0,1) if random_side == 1: print("Heads") else: print("Tails")
لیستها در پایتون
لیستها در پایتون یکی از انواع دادههای توالی (sequence) هستند که میتوانند شامل هر نوع دادهای باشند، از جمله اعداد، رشتهها و حتی لیستهای دیگر. در ادامه، به بررسی جامع لیستها در پایتون میپردازیم.
ایجاد لیست
یک لیست در پایتون با استفاده از براکتها []
و جداکنندهی کاما ,
ایجاد میشود:
my_list = [1, 2, 3, 4, 5] print(my_list) # Output: [1, 2, 3, 4, 5]
اندیسها و برش لیست
میتوانیم با استفاده از اندیسها به عناصر یک لیست دسترسی پیدا کنیم. اندیسها در پایتون از صفر شروع میشوند:
my_list = [1, 2, 3, 4, 5] print(my_list[0]) # Output: 1
همچنین میتوانیم از برش لیست (list slicing) برای دسترسی به زیرمجموعهای از عناصر لیست استفاده کنیم:
my_list = [1, 2, 3, 4, 5] print(my_list[1:3]) # Output: [2, 3]
متدهای لیست
لیستها در پایتون تعداد زیادی متد دارند که با استفاده از آنها میتوانیم با لیستها کار کنیم. برخی از این متدها عبارتاند از:
append(x)
: عنصر x را به انتهای لیست اضافه میکند.extend(iterable)
: تمام عناصر iterable را به انتهای لیست اضافه میکند.insert(i, x)
: عنصر x را در اندیس i وارد لیست میکند.remove(x)
: اولین عنصری را که مقدار آن x است از لیست حذف میکند.pop(i)
: عنصر موجود در اندیس i را حذف میکند و آن را برمیگرداند.index(x)
: اندیس اولین عنصری را که مقدار آن x است برمیگرداند.count(x)
: تعداد دفعاتی که x در لیست ظاهر شده است را برمیگرداند.sort()
: عناصر لیست را به ترتیب مرتب میکند.reverse()
: ترتیب عناصر لیست را معکوس میکند.
در زیر جدولی از متدهای لیست در پایتون و توضیحاتی درباره آنها و مثالهایی از استفاده از آنها را میبینید:
متد | توضیح | مثال | خروجی مثال |
---|---|---|---|
append(x) |
عنصر x را به انتهای لیست اضافه میکند | my_list = [1, 2, 3]; my_list.append(4); print(my_list) |
[1, 2, 3, 4] |
clear() |
تمام عناصر لیست را حذف میکند | my_list = [1, 2, 3]; my_list.clear(); print(my_list) |
[] |
copy() |
یک کپی از لیست را برمیگرداند | my_list = [1, 2, 3]; new_list = my_list.copy(); print(new_list) |
[1, 2, 3] |
count(x) |
تعداد دفعاتی که x در لیست ظاهر شده است را برمیگرداند | my_list = [1, 2, 3, 2]; print(my_list.count(2)) |
2 |
extend(iterable) |
تمام عناصر iterable را به انتهای لیست اضافه میکند | my_list = [1, 2, 3]; my_list.extend([4, 5]); print(my_list) |
[1, 2, 3, 4, 5] |
index(x) |
اندیس اولین عنصری را که مقدار آن x است برمیگرداند | my_list = [1, 2, 3, 2]; print(my_list.index(2)) |
1 |
insert(i, x) |
عنصر x را در اندیس i وارد لیست میکند | my_list = [1, 2, 3]; my_list.insert(1, 'a'); print(my_list) |
[1, ‘a’, 2, 3] |
pop(i) |
عنصر موجود در اندیس i را حذف میکند و آن را برمیگرداند | my_list = [1, 2, 3]; print(my_list.pop(1)); print(my_list) |
2, [1, 3] |
remove(x) |
اولین عنصری را که مقدار آن x است از لیست حذف میکند | my_list = [1, 2, 3, 2]; my_list.remove(2); print(my_list) |
[1, 3, 2] |
reverse() |
ترتیب عناصر لیست را معکوس میکند | my_list = [1, 2, 3]; my_list.reverse(); print(my_list) |
[3, 2, 1] |
sort() |
عناصر لیست را به ترتیب مرتب میکند | my_list = [2, 1, 3]; my_list.sort(); print(my_list) |
[1, 2, 3] |
توجه داشته باشید که خروجیهای مثالها بر اساس دادههای ورودی مشخص شدهاند و در صورت تغییر دادههای ورودی، خروجی نیز تغییر خواهد کرد.
لیستها در پایتون ابزاری قدرتمند و انعطافپذیر برای کار با دادهها هستند. با استفاده از متدها و توابع مختلف، میتوانیم به راحتی لیستها را ایجاد کنیم، با آنها کار کنیم و آنها را تغییر دهیم. این امکانات، پایتون را برای برنامهنویسی مرتبط با دادهها، علوم کامپیوتر، وب، علوم داده و بسیاری از کاربردهای دیگر بسیار قدرتمند میکند.
رندومایز کردن لیستها در پایتون
در دنیای برنامهنویسی، گاهی اوقات نیاز داریم تا عناصر یک لیست را به صورت تصادفی مرتب کنیم یا از آنها به صورت تصادفی انتخاب کنیم. در این مقاله، به بررسی روشهای مختلف رندومایز کردن لیستها در پایتون میپردازیم و از ماژول random
پایتون برای این منظور استفاده میکنیم.
استفاده از متد shuffle()
یکی از روشهای ساده برای رندومایز کردن لیستهای پایتون استفاده از متد shuffle()
است که در ماژول random
قرار دارد. این متد، لیست ورودی را درجا (in-place) به صورت تصادفی مرتب میکند.
import random my_list = [1, 2, 3, 4, 5] random.shuffle(my_list) print(my_list) # Output: [3, 2, 5, 1, 4] (output will be different each time)
استفاده از متد choice() و choices()
متد choice()
یک عنصر تصادفی از لیست را برمیگرداند. این متد برای انتخاب تصادفی یک عنصر از لیست بسیار مفید است.
import random my_list = [1, 2, 3, 4, 5] print(random.choice(my_list)) # Output: 3 (output will be different each time)
از طرفی، متد choices()
یک لیست از عناصر تصادفی از لیست ورودی را برمیگرداند. این متد برای انتخاب تصادفی چندین عنصر از لیست بسیار مفید است.
import random my_list = [1, 2, 3, 4, 5] print(random.choices(my_list, k=3)) # Output: [4, 1, 5] (output will be different each time)
خطاهای فهرست (IndexErrors) و کار با فهرستهای تو در تو در پایتون
مواجهه با خطاهای فهرست (یا IndexErrors) در پایتون معمولاً زمانی رخ میدهد که شما سعی میکنید یک عنصری را در فهرستی که در آن وجود ندارد، بازیابی کنید. برای فهم بهتر، با دادن مثالی ساده شروع میکنیم:
my_list = [1, 2, 3, 4, 5] print(my_list[5])
در این مثال، ما سعی داریم عنصری را با فهرستی که در فهرست my_list
وجود ندارد، چاپ کنیم. این خطا باعث ایجاد خطای IndexError: list index out of range
میشود.
نکته: شمارش پایتون از 0 شروع میشه نه 1 برای همین در این مثال 5 مین در لیست پیدا نشد.
با این حال، این خطاها میتوانند هنگام کار با فهرستهای تو در تو کمی پیچیدهتر باشند. فهرستهای تو در تو، فهرستهایی هستند که درون آنها فهرستهای دیگری قرار دارد. برای مثال:
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(nested_list[0][3])
در این مثال، ما سعی داریم عنصری را با فهرستی که در فهرست اول nested_list
وجود ندارد، چاپ کنیم. این خطا باعث ایجاد خطای IndexError: list index out of range
میشود.
برای جلوگیری از این خطاها، میتوانیم از عملگر len
استفاده کنیم تا تعداد عناصر درون فهرست را بررسی کنیم:
if len(my_list) > 5: print(my_list[5]) else: print("The index is out of range.")
همچنین برای فهرستهای تو در تو:
if len(nested_list[0]) > 3: print(nested_list[0][3]) else: print("The index is out of range.")
با استفاده از این روش، میتوانیم مطمئن شویم که از خارج از محدوده فهرست دسترسی نمیگیریم و از بروز خطای فهرست جلوگیری میکنیم.
ساخت یک بازی ساده با لیست ها
row1 = ["⬜️","⬜️","⬜️"] row2 = ["⬜️","⬜️","⬜️"] row3 = ["⬜️","⬜️","⬜️"] map = [row1, row2, row3] print(f"{row1}\n{row2}\n{row3}") position = input("Where do you want to put the treasure? ") horizonal = int(position[0]) vertical = int(position[1]) map[vertical - 1] [horizonal - 1] = "X" print(f"{row1}\n{row2}\n{row3}")
این برنامه با استفاده از فهرستهای تو در تو (یا یک فهرست دو بعدی) یک نقشه گنج ساخته است. در ابتدا، سه ردیف ساخته شده و هر کدام را با سه کادر سفید پر میکند. سپس این سه ردیف را در یک فهرست بزرگتر (که به عنوان نقشه خدمت میکند) قرار میدهد.
برنامه با چاپ کردن سه ردیف این نقشه، نقشه اولیه را به کاربر نشان میدهد.
سپس، از کاربر درخواست میشود تا مکان گنج را وارد کند. در اینجا، ما فرض میکنیم که کاربر دو رقم وارد میکند: اولی برای ستون (یا افقی) و دومی برای ردیف (یا عمودی).
با استفاده از این دو رقم، برنامه گنج را در نقشه قرار میدهد. با توجه به اینکه فهرستها در پایتون از صفر شروع میشوند، برای قرار دادن گنج در مکان درست، از هر یک از ارقام که کاربر وارد کرده یک کم میکنیم (vertical - 1
و horizonal - 1
).
در نهایت، برنامه نقشه جدید را با گنج در مکان انتخاب شده چاپ میکند.
بازی سنگ کاغذ قیچی با پایتون
import random rock = ''' _______ ---' ____) (_____) (_____) (____) ---.__(___) ''' paper = ''' _______ ---' ____)____ ______) _______) _______) ---.__________) ''' scissors = ''' _______ ---' ____)____ ______) __________) (____) ---.__(___) ''' game_images = [rock, paper, scissors] user_choice = int(input("What do you choose? Type 0 for Rock, 1 for Paper or 2 for Scissors.\n")) print(game_images[user_choice]) computer_choice = random.randint(0, 2) print("Computer chose:") print(game_images[computer_choice]) if user_choice >= 3 or user_choice < 0: print("You typed an invalid number, you lose!") elif user_choice == 0 and computer_choice == 2: print("You win!") elif computer_choice == 0 and user_choice == 2: print("You lose") elif computer_choice > user_choice: print("You lose") elif user_choice > computer_choice: print("You win!") elif computer_choice == user_choice: print("It's a draw")
کد فوق یک بازی سنگ، کاغذ و قیچی ساده را پیادهسازی میکند. به این ترتیب کار میکند:
- سه عکس از سنگ، کاغذ و قیچی تعریف شده است.
game_images
، فهرستی از این سه عکس است، که به ترتیب سنگ، کاغذ و قیچی را نشان میدهد.- از کاربر درخواست میشود تا یکی از گزینهها را با تایپ کردن 0 (برای سنگ)، 1 (برای کاغذ) یا 2 (برای قیچی) انتخاب کند.
- با استفاده از این عدد، عکس مربوط به گزینه کاربر چاپ میشود.
- سپس، کامپیوتر یک گزینه به صورت تصادفی انتخاب میکند.
random.randint(0, 2)
یک عدد تصادفی بین 0 و 2 ایجاد میکند. - عکس مربوط به گزینه کامپیوتر چاپ میشود.
- سپس با استفاده از یک سری شرط if/elif، نتیجه بازی مشخص میشود. این شرایط موارد خاصی مانند “سنگ میبرد قیچی” (کاربر انتخاب سنگ کرده و کامپیوتر انتخاب قیچی کرده) و “کاغذ میبرد سنگ” (کاربر انتخاب کاغذ کرده و کامپیوتر انتخاب سنگ کرده) را بررسی میکند. اگر کاربر یک عدد غیرمعتبر وارد کند، به طور خودکار بازی را از دست میدهد.
به این ترتیب، بازی سنگ، کاغذ، قیچی پیاده سازی میشود. بازیکن انتخاب خود را میکند، کامپیوتر به صورت تصادفی یک انتخاب انجام میدهد، و سپس بازیکن میفهمد که آیا برده یا باخته است.