परम्युटेशन किसी सेट के तत्वों को किसी क्रम में व्यवस्थित करना है। पायथन में इसे कई तरीकों से किया जा सकता है।
विधि 1: itertools मॉड्यूल (अनुशंसित)
पायथन का itertools मॉड्यूल परम्युटेशन और कॉम्बिनेशन के लिए बिल्ट-इन फ़ंक्शन प्रदान करता है।
>>> import itertools
>>> 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)]
कॉम्बिनेशन (क्रम महत्वपूर्ण नहीं)
>>> list(itertools.combinations('1234', 2))
[('1', '2'), ('1', '3'), ('1', '4'), ('2', '3'), ('2', '4'), ('3', '4')]
विधि 2: रिकर्सिव जेनरेटर (इन-प्लेस स्वैपिंग)
मेमोरी-कुशल दृष्टिकोण जो इंटरमीडिएट लिस्ट नहीं बनाता:
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]
विधि 3: सिंपल रिकर्सन (कॉपी के साथ)
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]
तुलना
| विधि | पक्ष | विपक्ष |
|---|---|---|
itertools.permutations | तेज़, C में कार्यान्वित, पढ़ने में आसान | सभी परिणाम एक साथ मेमोरी में आ सकते हैं |
| जेनरेटर (विधि 2) | मेमोरी-कुशल, लेज़ी मूल्यांकन | थोड़ा जटिल कोड |
| सिंपल रिकर्सन (विधि 3) | समझने में आसान | कॉपी के कारण धीमा, अधिक मेमोरी |
सिफारिश
अधिकांश व्यावहारिक उद्देश्यों के लिए itertools.permutations का उपयोग करें। बड़ी सीक्वेंस के लिए जहां मेमोरी चिंता का विषय है, जेनरेटर-आधारित दृष्टिकोण (विधि 2) बेहतर है।