Quizás el título no esté claro, así que déjame explicarme.

Digamos que tengo una cadena: "1234567890"

Y quiero imponerlo con una particularidad: cada combinación debe tener 6 caracteres de longitud, nada menos, nada más. Ya obtuve un ejemplo de itertools de una fuerza bruta completa (con alfabeto, números y símbolos) que me da todos los valores con longitudes de 1 a 6, pero no quiero eso ... Aquí está por cierto:

from itertools import chain, product
def bruteforce(charset, maxlength):
    file = open("test.txt", "w")
    return (''.join(candidate)
        for candidate in chain.from_iterable(product(charset, repeat=i)
        for i in range(1, maxlength + 1)))
var = str((list(bruteforce("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ²&é(-è_çà)=^$*ù,;:!<1234567890°+¨£µ%?./§>~{[|`\^@]}¤€ .", 6))))
file.write(var)
file.close()
print("Done")

Entonces, ¿sabes una manera de hacer esto, tal vez con numpy? Ya pensé en hacer una fuerza bruta "clásica" y luego con un bucle for, eliminar todos los elementos con len (elemento) <6, pero lleva mucho tiempo y realmente no está optimizado.

También vi eso: Cómo obtener todas las combinaciones posibles de shuffle usando numpy Pero parece que solo toma 2 números, 0 o 1, y no 10 números como me gustaría. Realmente no sé numpy, entonces ¿tal vez hay una manera de adaptarlo?

Si puede ayudarme, gracias, y no dude en pedir aclaraciones si no estaba claro en un punto.

0
The Machinist 1 may. 2020 a las 13:31

2 respuestas

La mejor respuesta

itertools.combinations_with_replacement (iterable, r) es solo para eso :

Devuelve subsecuencias de longitud r de elementos de la entrada iterable permitiendo que los elementos individuales se repitan más de una vez.

from itertools import combinations_with_replacement

chars = "1234567890"

for candidate in combinations_with_replacement(chars, r=6):
    print(''.join(candidate))

Salida:

111111
111112
111113
111114
111115
111116
111117
111118
111119
111110
111122
111123
111124
111125
...
2
Thierry Lathuille 1 may. 2020 a las 10:38

Si entiendo bien su problema, necesita itertools.permutations o itertools.combinations. Aquí hay un ejemplo:

from itertools import permutations #or combinations
def bruteforce(charset, maxlength):
    return (''.join(candidate) for candidate in permutations(charset, maxlength))
#or return (''.join(candidate) for candidate in combinations(charset, maxlength))
1
Ziheng Zhang 1 may. 2020 a las 10:44