গণিতে, একটি সেটের সব সদস্যকে কোনো ক্রম বা সিকোয়েন্সে সাজানো এবং যদি সেটটি ইতিমধ্যে অর্ডার করা থাকে, তবে এর এলিমেন্টগুলোকে পুনর্বিন্যাস (রি-অর্ডারিং) করা পারমুটেশন বলা হয়। আমরা বিভিন্ন টেকনিক ব্যবহার করে পারমুটেশন জেনারেট করতে পারি। নিচে কিছুটি দেওয়া হলো:
পদ্ধতি ১
পাইথনে পারমুটেশন এবং কম্বিনেশনের জন্য একটি ডেডিকেটেড মডিউল আছে যেটিকে itertools বলা হয়।
প্রথমে মডিউলটি আমদানি করুন
>>> import itertools >>>
পারমুটেশন ফাংশন আমাদেরকে একটি লিস্টের মধ্যে N ভ্যালুর পারমুটেশন পেতে দেয়, যেখানে ক্রম গুরুত্বপূর্ণ। উদাহরণস্বরূপ, [1,2,3,4] থেকে N = 2 ভ্যালু সিলেকশন নিচে দেওয়া হলো:
Permutation (order matters): >>> print(list(itertools.permutations([1,2,3,4],2))) [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
কম্বিনেশন (ক্রম গুরুত্বপূর্ণ নয়)
>>> print(list(itertools.combinations('1234', 2)))
[('1', '2'), ('1', '3'), ('1', '4'), ('2', '3'), ('2', '4'), ('3', '4')]
পদ্ধতি ২
নিচে কোনো নতুন ইন্টারমিডিয়েট লিস্ট তৈরি না করে একটি লিস্টে ইমপ্লিমেন্টেশন দেওয়া হলো।
def permute(xs, low=0):
if low + 1 >= len(xs):
yield xs
else:
for p in permute(xs, low + 1):
yield p
for i in range(low + 1, len(xs)):
xs[low], xs[i] = xs[i], xs[low]
for p in permute(xs, low + 1):
yield p
xs[low], xs[i] = xs[i], xs[low]
for p in permute([1, 2, 3]):
print(p)
আউটপুট
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 2, 1] [3, 1, 2]
পদ্ধতি ৩: রিকার্শন ব্যবহার করে
import copy
def perm(prefix, rest):
for e in rest:
new_rest = copy.copy(rest)
new_prefix = copy.copy(prefix)
new_prefix.append(e)
new_rest.remove(e)
if len(new_rest) == 0:
print(new_prefix + new_rest)
continue
perm(new_prefix, new_rest)
perm([], [1, 2, 3])
আউটপুট
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]