Форум сайта python.su
Здравствуйте уважаемые посетители и разработчики!
Есть задачка на создание всех возможных паролей методом рекурсии. Так как я в изучении языка новичок, к как не бился не получается решить эту задачу.
Условия - есть произвольный словарь/алфавит символов и есть произвольная длина пароля. Нужно сделать базу всех возможных паролей. Т.е. по сути перебор всех значений (рекурсия по 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).
Но, к сожалению так ничего не получилось.
Подскажите, как решить эту задачу или где можно почитать об этой теме. Спасибо.
Офлайн
Может стоит воспользоваться функциями модуля itertools combinations(), permutations()
Офлайн
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)
Офлайн
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)
Офлайн
Хороший вариант. Разве что ‘<’ можно заменить на ‘=’ :)
Отредактировано fata1ex (Май 20, 2012 23:18:03)
Офлайн
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)]
Офлайн