Форум сайта python.su
0
Здравствуйте уважаемые посетители и разработчики!
Есть задачка на создание всех возможных паролей методом рекурсии. Так как я в изучении языка новичок, к как не бился не получается решить эту задачу.
Условия - есть произвольный словарь/алфавит символов и есть произвольная длина пароля. Нужно сделать базу всех возможных паролей. Т.е. по сути перебор всех значений (рекурсия по 2-хмерному массиву неопределенной длины), включая(!) отдельные символы алфавита. Например имеем:
alf = ‘abcdefghijklmnopqrstuvwxyz’
count = 2
# тогда всевозможное количество вариантов будет равно:
all_count = count**len(alf) + len(alf)
# Переменная, где будут храниться все значения
allpassw =
# сама рекурсионная функция
def recursion(dic, n):
global allpassw
if n <= 0: return 1
else:
for i in dic: allpassw.append(i)
return allpassw+recursion(dic, n-1)
# Вызываем процедуру
recursion(alf, count)
# Печатаем результат
print allpassw
Второй вариант, который я рассматривал был связан с функциями-генераторами (yield).
Но, к сожалению так ничего не получилось.
Подскажите, как решить эту задачу или где можно почитать об этой теме. Спасибо.
Офлайн
568
Может стоит воспользоваться функциями модуля itertools combinations(), permutations()
Офлайн
52
def string_permutations(string, prefix=""): if len(string) == 1: yield prefix + string else: for idx in xrange(len(string)): for perm in string_permutations(string[:idx] + string[idx+1:], prefix+string[idx]): yield perm
from itertools import combinations_with_replacement as com from itertools import permutations as perm alphabet = 'abc' passwords = { length: set() for length in xrange(1, len(alphabet)+1) } for password_len in xrange(1, len(alphabet)+1): for pre_password in com(alphabet, password_len): for password in perm(pre_password): # that sucks passwords[password_len].add(''.join(password)) print passwords
Отредактировано fata1ex (Май 20, 2012 20:51:05)
Офлайн
0
fata1ex и FishHook, спасибо за предоставленный код и ответ - буду разбираться. Также возьму на вооружение указанные библиотеки. В целом задача решилась.
Вот здесь я задал этот же вопрос. Предложили вот такой вариант:
chars = string.ascii_lowercase passwords = [] def recursion(count, s=""): if count <= 0: passwords.append(s) return for c in chars: recursion(count - 1, s+c) recursion(2)
Офлайн
52
Хороший вариант. Разве что ‘<’ можно заменить на ‘=’ :)
Отредактировано fata1ex (Май 20, 2012 23:18:03)
Офлайн
36
bi01
fata1ex и FishHook, спасибо за предоставленный код и ответ - буду разбираться. Также возьму на вооружение указанные библиотеки. В целом задача решилась.
Вот здесь я задал этот же вопрос. Предложили вот такой вариант:chars = string.ascii_lowercase passwords = [] def recursion(count, s=""): if count <= 0: passwords.append(s) return for c in chars: recursion(count - 1, s+c) recursion(2)
import string from itertools import product passwords = ["".join(x) for x in product(string.ascii_lowercase, repeat=2)]
Офлайн