मैं अजगर में इसके कार्यान्वयन को देख के बाद से मेरे सामने दिए गए जवाब product
का उपयोग कर नापसंद प्रलेखन यह परिणाम उत्पन्न करने से पहले स्मृति में पूरी चीज को स्मृति में एक सूची में फैलाता प्रतीत होता है।
एएफएफ ने स्वयं कहा है कि यह आपके मामले के लिए बहुत बुरा है, क्योंकि यहां पर क्रमपरिवर्तन की संख्या बहुत बड़ी है (एक मिलियन से अधिक)। इस मामले के लिए yield
कथन बनाया गया था - ताकि स्मृति में फैले हुए विशाल सूची को गतिशील रूप से उत्पन्न किया जा सके (मुझे अपमानजनक range
भी नापसंद किया गया जहां xrange
पूरी तरह से लागू है)।
मैं इस तरह के समाधान के लिए जाना चाहते हैं:
def generate(chars, length, prefix = None):
if length < 1:
return
if not prefix:
prefix = ''
for char in chars:
permutation = prefix + char
if length == 1:
yield permutation
else:
for sub_permutation in generate(chars, length - 1, prefix = permutation):
yield sub_permutation
इस तरह, वह सब याद में फैला हुआ है एक पुनरावर्ती ढेर है "n" गहरी, जहां "n" अपने क्रमपरिवर्तन की लंबाई है (4 इस मामले में) और हर बार केवल एक ही तत्व लौटाया जाता है।
वर्ण चुनने के लिए वर्णों का सेट है, लंबाई 4 है और उपयोग उत्पादों के समान ही है, सिवाय इसके कि यह रन टाइम के दौरान स्मृति में पूरी सूची नहीं फैलता है।
आपके प्रश्न को समझना बहुत मुश्किल है ... क्या a07z कानूनी स्ट्रिंग होगी या नहीं? – immortal
हां। सभी अल्फान्यूमेरिक स्ट्रिंग्स लम्बाई 1-4 कानूनी – joseph
हैं तो जब आप कहते हैं कि 0-9 ए-जेड से पहले हैं तो आपका मतलब है कि 0000 ए000 से पहले आना चाहिए? – immortal