2014-05-18 2 views
2

itertools를 사용하여 몇 가지 조합을 생성하려고했는데, 요소 수를 늘리면 기하 급수적으로 늘어날 것입니다. 생성 할 순열의 최대 수를 제한하거나 지시하여 제한에 도달 한 후 itertools가 중지되도록 할 수 있습니까?파이썬에서 조합/순열의 수를 제한

제가 말을 의미하는 것입니다 :

현재 내가

#big_list is a list of lists 
permutation_list = list(itertools.product(*big_list)) 

현재이 순열 목록 6 백만 순열을 가지고 있습니다. 다른 목록을 추가하면이 숫자가 10 억 개가 될 것이라고 확신합니다.

내가 정말로 필요로하는 것은 많은 양의 순열 (perm ifations)이다 (5000을 말한다). 생성 된 permutation_list의 크기를 제한하는 방법이 있습니까?

+0

정말로 목록이 필요합니까? 반복자는 매우 적은 메모리를 사용하며 목록만큼 빠릅니다 (또는 그 이상). – Davidmh

답변

8

당신은 그것은 메모리에 전체 목록을 생성하지 않습니다이

itertools.islice(itertools.product(*big_list), 5000) 

처럼 itertools.islice를 사용해야하지만, 게으르게 실제 반복 가능한 소비 반복자를 반환합니다. 당신이

list(itertools.islice(itertools.product(*big_list), 5000)) 
+1

+1, 이것은 최고의 솔루션입니다. –

+0

이것은 시작과 멈춤을 쉽게 설정할 수 있기 때문에 올바른 해결책입니다. – Davidmh

1

itertools.islice 같은 목록에 그것을 변환 할 수있는 것은 같은 startstep를 설정하는 기능과 같은 많은 장점이 있습니다. 아래의 솔루션은 유연하지 않으므로 start이 0이고 step이 1 인 경우에만 사용해야합니다. 반면에 수입품은 필요하지 않습니다.


당신은 주위 itertools.product

it = itertools.product(*big_list) 
pg = (next(it) for _ in range(5000)) # generator expression 

(next(it) for _ in range(5000))가 5000 개 이상의 값을 생성 할 수 없습니다 발전기를 반환하는 작은 래퍼를 만들 수 있습니다. list 생성자

pl = list(pg) 

사용하거나 대괄호 (대신 둥근 것)

pl = [next(it) for _ in range(5000)] # list comprehension 

처음만큼 효율적 다른 용액으로 발전기 식 감싸서 list로 변환 , zip이 정지 반복자를 반환 파이썬 3+에서

pg = (p for p, _ in zip(itertools.product(*big_list), range(5000)) 

작품 때 가장 짧은 반복 가능하다. list으로의 변환은 첫 번째 솔루션에서와 같이 수행됩니다.

+0

@frostnational. 좋은 솔루션, 잘 작동합니다. 불행히도 나는 받아 들일 수있는 답변 하나만 표시 할 수 있습니다. 그러나 이것은 잘 작동합니다. 고맙습니다. –

+0

또는'permutation_generator'를 완전히 건너 뛸 수 있고 목록 이해력을 사용할 수 있습니다. 또는 더 간단하게,'[x는 _, x in zip (xrange (5000), iterator)]' – Davidmh