2017-12-15 16 views
1

itertools로 어떻게 할 수 있습니까? 아니면 효율적으로 할 수 있습니까? 해당 목록의 길이는 557845배열 요소로 모든 조합을 생성하고 대신 itertools를 사용하여 형식화 된 문자열을 넣을 수 있습니까?

#Generate all combinations of 4 elements and put on list  
listLol=list(map("".join, itertools.combinations('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',4))) 
#This is too slow 
    for a in listLol: 
     for b in listLol: 
      for c in listLol: 
       for d in listLol: 
        for e in listLol: 
         cadena="SomeString-"+a+"-"+b+"-"+c+"-"+d+"-"+e 
+7

어 ... 50 만개의 요소 목록에 5 개의 중첩 루프를 실행하고 싶습니다 ... 무엇을하려고합니까? –

+1

중첩 루프가 본질적으로'listLol' 밖에서 조합을 생성하지 않습니까? 중복으로, 확실히. 그러나 당신은 그것을 에뮬레이션 할 수 있습니다. 실제 목표가 무엇인지 조금 더 설명해 주시겠습니까? – mypetlion

+0

나는 암호화 된 문자열을 가지고 있으며 암호화되지 않은 문자열의 구조 만 알고 암호화하고 비교할 문자열을 얻어야합니다. 그것은 내가 생각하기에 해쉬를 크랙킹하는 것과 같습니다. – user3626760

답변

0

itertools.product으로 실제로 가능합니다.

IllAdvised = ["SomeString-" + "-".join(i) for i in itertools.product(listLol, repeat=5)] 

당신은 또한 당신의 원본 목록을 생성하기위한 itertools.combinations_with_replacement보다는 단순히 itertools.combinations을 고려할 수 있습니다. EDIT :itertools.product은 원래 목록에서도 원하는 내용 일 수 있습니다. 이 경우 바로 itertools.product(alphabetALPHABET, repeat=20)을 사용하여 바로 이동할 수 있습니다. (은 당연히 원래 문자열입니다.)

그러나이 작업을 수행하는 방법에 관계없이 매우 오랜 시간이 걸릴 것입니다. 목록에 557845^5 개의 요소가 있거나 combinations_with_replacement 또는 itertools.product을 사용하면 7311616^5가 있습니다. 이 새 목록에 10 개 이상의 28 개 요소가 있습니다.

for i in itertools.product(listLol, repeat=5): 
    cadena="SomeString-" + "-".join(i) 
    #do something with cadena 

이 루프의 런타임은 유니버스의 현재 보존 기간을 초과합니다. 이 장벽은 언어를 얼마나 잘 알고 있건간에 또는 적용하는 작은 최적화가 무엇이든 상관없이 다루기가 어렵습니다. 다른 접근 방법을 시도해 보시기 바랍니다.

+0

@StefanPochmann 잘 잡으십시오. 대신에 itertools.product를 사용하도록 답변을 편집하겠습니다. – colopop

+0

@StefanPochmann 기본 인수의 이름을 지정하기 만하면됩니다. 결정된. 덧붙여 말하자면, SO는 왼쪽 하단에 "편집"버튼을 제공하므로 다음에 20 자로 문제를 해결할 수 있습니다. 70 자의 불만을 남기지 않고 직접 추가 할 수 있습니다. – colopop