पायथन का itertools मॉड्यूल पर्म्यूटेशन और कॉम्बिनेशन जेनरेट करने के लिए कुशल फंक्शन्स प्रदान करता है।
इंस्टॉलेशन/इम्पोर्ट
from itertools import permutations, combinations, combinations_with_replacement
पर्म्यूटेशन (क्रम महत्वपूर्ण)
क्रम में व्यवस्था: nPr = n! / (n-r)!
उदाहरण 1: पूर्ण पर्म्यूटेशन
items = ['a', 'b', 'c']
perms = permutations(items)
for p in perms:
print(p)
आउटपुट
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
उदाहरण 2: निर्दिष्ट लंबाई (r) के साथ पर्म्यूटेशन
items = ['p', 'y', 't', 'h', 'o', 'n']
perms = permutations(items, 2) # लंबाई 2
for p in perms:
print(p)
आउटपुट
('p', 'y') ('p', 't') ('p', 'h') ('p', 'o') ('p', 'n')
('y', 'p') ('y', 't') ('y', 'h') ('y', 'o') ('y', 'n')
('t', 'p') ('t', 'y') ('t', 'h') ('t', 'o') ('t', 'n')
('h', 'p') ('h', 'y') ('h', 't') ('h', 'o') ('h', 'n')
('o', 'p') ('o', 'y') ('o', 't') ('o', 'h') ('o', 'n')
('n', 'p') ('n', 'y') ('n', 't') ('n', 'h') ('n', 'o')
कॉम्बिनेशन (क्रम महत्वपूर्ण नहीं)
चयन जहां क्रम मायने नहीं रखता: nCr = n! / (r!(n-r)!)
उदाहरण 1: निर्दिष्ट लंबाई के कॉम्बिनेशन्स
items = ['p', 'y', 't', 'h', 'o', 'n']
combos = combinations(items, 5) # 5 एलिमेंट्स चुनें
for c in combos:
print(c)
आउटपुट
('p', 'y', 't', 'h', 'o')
('p', 'y', 't', 'h', 'n')
('p', 'y', 't', 'o', 'n')
('p', 'y', 'h', 'o', 'n')
('p', 't', 'h', 'o', 'n')
('y', 't', 'h', 'o', 'n')
उदाहरण 2: रिप्लेसमेंट के साथ कॉम्बिनेशन्स
एलिमेंट्स दोहराए जा सकते हैं।
combos = combinations_with_replacement(items, 2)
for c in combos:
print(c)
आउटपुट
('p', 'p') ('p', 'y') ('p', 't') ('p', 'h') ('p', 'o') ('p', 'n')
('y', 'y') ('y', 't') ('y', 'h') ('y', 'o') ('y', 'n')
('t', 't') ('t', 'h') ('t', 'o') ('t', 'n')
('h', 'h') ('h', 'o') ('h', 'n')
('o', 'o') ('o', 'n')
('n', 'n')
व्यावहारिक उदाहरण
पासवर्ड क्रैकिंग (ब्रूट फोर्स - केवल शिक्षा के लिए)
import itertools
import string
def brute_force_password(target, max_length=4):
chars = string.ascii_lowercase + string.digits
for length in range(1, max_length + 1):
for attempt in itertools.product(chars, repeat=length):
guess = ''.join(attempt)
if guess == target:
return guess
return None
# केवल डेमो के लिए बहुत छोटा पासवर्ड
print(brute_force_password("ab1", 3))
टीम पेयरिंग
players = ['Alice', 'Bob', 'Charlie', 'David']
# सभी संभावित मैच (कॉम्बिनेशन - क्रम नहीं)
matches = list(combinations(players, 2))
print("संभावित मैच:")
for m in matches:
print(f" {m[0]} vs {m[1]}")
# टूर्नामेंट शेड्यूल (पर्म्यूटेशन - क्रम मायने रखता है यदि होम/अवे)
schedule = list(permutations(players, 2))
print(f"\nकुल शेड्यूल स्लॉट्स: {len(schedule)}")
लॉटरी नंबर जनरेटर
import random
from itertools import combinations
# 1-49 से 6 नंबर चुनें
all_combos = list(combinations(range(1, 50), 6))
print(f"कुल संभावनाएं: {len(all_combos):,}") # 13,983,816
# रैंडम टिकट
winning = sorted(random.sample(range(1, 50), 6))
print(f"विजेता नंबर: {winning}")
अन्य उपयोगी itertools फंक्शन्स
| फंक्शन | विवरण |
|---|---|
product(*iterables, repeat=1) | कार्टेशियन प्रोडक्ट (नेस्टेड लूप्स) |
permutations(iterable, r) | क्रमबद्ध व्यवस्थाएं |
combinations(iterable, r) | अक्रमबद्ध चयन |
combinations_with_replacement(iterable, r) | दोहराव के साथ चयन |
प्रदर्शन नोट
- ये फंक्शन्स इटरेटर्स लौटाते हैं - मेमोरी कुशल
- बड़े परिणामों के लिए
list()न करें, सीधे इटरेट करें math.comb(n, k)औरmath.perm(n, k)(पायथन 3.8+) केवल काउंट के लिए
import math print(math.comb(49, 6)) # 13983816 - कॉम्बिनेशन्स काउंट print(math.perm(6, 2)) # 30 - पर्म्यूटेशन्स काउंट