No me gusta la respuesta dada ante mí usando product
mirando desde su implementación en el pitón documentación parece abarcar toda la cosa en una lista en la memoria antes de comenzar a dar los resultados.
Esto es muy malo para su caso ya que, como él mismo dijo, el número de permutación aquí es enorme (más de un millón). Para este caso, se creó la declaración yield
, de modo que las listas enormes pudieran generarse dinámicamente en lugar de distribuirse en la memoria (tampoco me gustó el despilfarrador range
donde xrange
es perfectamente aplicable).
me gustaría ir para una solución como esta:
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
De esta manera, todo lo que se extiende en la memoria es una pila recursiva "n" de profundidad, donde "n" es la longitud de sus permutaciones (4 en este caso) y solo se devuelve un solo elemento cada vez.
caracteres es el conjunto de caracteres a elegir, la longitud es 4 y el uso es bastante similar a los productos, excepto que no abarca toda la lista en la memoria durante el tiempo de ejecución.
Es demasiado difícil entender su pregunta ... ¿sería a07z una cadena legal o no? – immortal
Sí. Todas las cadenas alfanuméricas de longitud 1-4 son legales – joseph
Entonces, cuando dices 0-9 antes de A-Z, ¿quieres decir que 0000 debería aparecer antes de A000? – immortal