2017-12-10 14 views
0
alphabet =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
key = '' 
for a in range(26): 
    key += alphabet[a] 
    print(key) 
    key = '' 

for a in range(26): 
    for b in range(26): 
     key += alphabet[a]+ alphabet[b] 
     print(key) 
     key = '' 

for a in range(26): 
    for b in range(26): 
     for c in range(26): 
      key += alphabet[a]+ alphabet[b]+ alphabet[c] 
      print(key) 
      key = '' 

안녕하세요! 저는 20 자 이하의 모든 단어를 생성하는 효율적인 프로그램이 필요합니다. 가능한 모든 1,2,3 문자 단어를 생성하기 위해 위 코드를 작성했습니다. 그러나 이것은 비효율적 인 방법 인 것 같습니다. 그래서 제 질문은 : '인가가이 말을 생성하는보다 효율적인 방법은 최대 개까지 20 개 문자를 포함하여' 편집 : 그최대 20 자까지 단어 생성하기

+1

당신은 itertools이 필요합니다. [순열 (https://docs.python.org/3/library/itertools.html#itertools.permutations)/[조합] (https://docs.python.org /3/library/itertools.html#itertools.combinations). –

+0

들어 본 적이없는 척 해줘 덕분에 –

+0

itertools를 사용하지 않을 경우 재귀를 사용하십시오. – Carlos

답변

1

아래 문자의 조합을 생산하는 itertools.product을 사용하여 도움이된다면 내가 파이썬 2.7.9에있어 단어를 결합하려면 ''.join입니다.

from string import ascii_lowercase as lowercase 
from itertools import product 

length = 5 

for word in (''.join(x) for x in product(lowercase, repeat=length)): 
    print(word) 

당신이 뭘하든 꽤 오랜 시간이 걸릴 것입니다. 5 글자로 된 단어도 26**5 가능성이 있으며, 이는 11881376 또는 거의 1,200 만 개입니다. 20 글자의 조합을 모두 생성하는 것이 절대적인 요구 사항이 아니라면, 그것을 피하는 방법을 찾아야합니다.

2

이것은 불가능합니다. 가능성의 수는 너무 많습니다. 최대 20 자까지 모든 조합을 쉽게 생성 할 수 있다면 암호 크래킹이 매우 쉽습니다.

초당 1 천만 개의 조합을 생성 할 수 있다고 가정 해 봅시다. 단지 20 자의 가능한 모든 조합을 생성하는 데 얼마나 걸립니까? 단, 이것은 20 자 이내의 단어입니다. 19 자 단어 또는 6 자 단어가 포함되지 않습니다.

>>> combinations = 20**26 
>>> per_second = 10000000 
>>> seconds_required = combinations/per_second 
>>> combinations 
6710886400000000000000000000000000 
>>> int(seconds_required) 
671088640000000000000000000 
>>> days_required = seconds_required/60/60/24 
>>> int(days_required) 
7767229629629629202432 
>>> years_required = days_required/365 
>>> int(years_required) 
21280081177067479040 
>>> age_of_universe = 13800000000 
>>> int(age_of_universe) 
13800000000 

당신은 특정 길이까지 조합을 생성하는 itertools.product를 사용할 수 있지만, 그것은 특정 길이 걸리는 긴 (그리고 얼마나 많은 메모리를 사용하는 경우) 시간에 할 것입니다. 나는 당신이 계산하기에 부당하게 길게되는 8-10자를 치면 당신이 발견 할 것이라고 생각한다.

>>> from itertools import product 
>>> import string 
>>> l = list(product(string.ascii_lowercase, repeat=5)) 
>>> len(l) 
11881376 
+0

시간이 오래 걸리지 만 프로그램이 작동하므로 가능하다고 생각됩니다. –

+0

@BenWhitehead 그러면 20자를 포함 할 수있는 모든 단어가 생성되지 않습니다. 위에 요구 된 시간을 보았습니까? 프로그램이 맞다면 잘못한 부분을 지적 해 주시겠습니까? –