2016-11-06 6 views
0
import itertools 
printable = 'abcdefghijklmnopqrstuvwxz' 
all_possibilites = ([''.join(i) for i in itertools.product(printable, repeat = 3)]) 
comparison = ['zd'] 
if comparison in all_possibilities: 
    print("match") 

내 코드 스 니펫입니다. 내 의도는 알파벳의 모든 단일 조합을 생성하는 것입니다. 여기에있는 스 니펫에는 3 자 제한이 있습니다. 너무 큰 파이썬은 메모리 오류를 반환합니다. 내 질문 :어떻게 메모리에서 잘못된 결과를 제거 할 수 있습니까?

유일한 제한 시간 메모리가 아닌 순서로 일치하지 않는 조합을 메모리에서 제거 할 수있는 방법이 있습니까? 글자 수 한도가 5 인 경우? 이것에 대한 더 자세한 내용은 도움이 될 것입니다.

+0

달성하고자하는 목표는 무엇입니까? 가능한 모든 알파벳 조합이 무슨 뜻인가요? 반복 크기를 무한대로 늘리면 무한한 조합이있게됩니다. 당신이 만드는 모든 n 글자 조합이 존재할 것이므로 비교 목적은 무엇입니까? itertools.product (range (3), repeat = 3)가 있으면 0,1,2의 가능한 모든 3 자리 조합을 갖게됩니다. 존재 여부를 확인할 필요가 없습니다. 물론 메모리가 빠르게 채워질 것입니다. n = 5이면 이미 26^5 개의 조합이 있습니다. – Daniel

답변

0

주된 결함은 먼저 전체 목록을 만든 다음 필터링하려고한다는 것입니다. 이것은 전체 목록을 메모리에 가져 오기 때문에 문제가됩니다.

당신은 당신이 실제로 필요합니다 모든 요소를,리스트-이해 내부에 조건을 추가하는 유지 좋을 것 : 당신이 결국 all_posibilities을 반복하는 찾고 있다면,

all_posibilities = ["".join(i) for i in itertools.product(printable, repeat = 5) if 'a' or 'b' in i] 
             ## ^^ place your condition here 
print(len(all_posibilities)) 

또는, 그것을 메모리 풋 프린트를 더 제한하기 위해 발전기를 만드는 것이 합리적입니다.