발전기의 일부 하위 집합을 필터링하는 가장 좋은 방법은 무엇입니까? 예를 들어, 문자열 "1023"을 가지고 있으며 각 숫자의 가능한 모든 조합을 생성하려고합니다. 모든 조합은 다음과 같습니다발전기 필터링
['1', '0', '2', '3']
['1', '0', '23']
['1', '02', '3']
['1', '023']
['10', '2', '3']
['10', '23']
['102', '3']
['1023']
나는 항목 중 하나에 선도적 인 0을 포함하는 부분 집합에 관심이 아니에요, 그래서 올바른 사람은 다음과 같습니다
['1', '0', '2', '3']
['1', '0', '23']
['10', '2', '3']
['10', '23']
['102', '3']
['1023']
나는 두 가지 질문이 있습니다.
1) 발전기를 사용하는 경우 앞에 오는 0으로 필터링하는 것이 가장 좋습니다. 현재는 모든 조합을 생성 한 다음 나중에 반복하고 하위 집합이 유효한 경우에만 계속합니다. 간단하게 샘플 코드에서 서브 세트 만 인쇄하고 있습니다. 생성 된 생성기가 매우 길거나 유효하지 않은 부분 집합이 많은 경우 전체 생성기를 순환하는 것이 거의 낭비입니다. 잘못된 항목 (선행 0이있는 항목)을 발견했을 때 발전기를 멈추고 'allCombinations'를 걸러 낼 방법이 있습니까?
2) 위와 같은 것이 없으면 이러한 조합을 생성하는 더 좋은 방법은 무엇입니까? 선행 제로와의 조합은 무시한다). 발전기를 사용하여
코드 :
import itertools
def isValid(subset): ## DIGITS WITH LEADING 0 IS NOT VALID
valid = True
for num in subset:
if num[0] == '0' and len(num) > 1:
valid = False
break
return valid
def get_combinations(source, comb):
res = ""
for x, action in zip(source, comb + (0,)):
res += x
if action == 0:
yield res
res = ""
digits = "1023"
allCombinations = [list(get_combinations(digits, c)) for c in itertools.product((0, 1), repeat=len(digits) - 1)]
for subset in allCombinations: ## LOOPS THROUGH THE ENTIRE GENERATOR
if isValid(subset):
print(subset)
'필터 '내장 함수를 보았습니까? –
@aryamccarthy : 파이썬 2에서'filter'는 열렬한 것이지, 생성기가 아닌리스트를 리턴합니다. – 9000
Python 2에는 지연 평가를위한 itertools.ifilter가 있습니다. Python 2 태그가 표시되지 않습니다. –