発電機からの一部のサブセットを除外する最良の方法は何ですか?たとえば、私は文字列 "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']
私は2つの質問があります。
1)ジェネレータを使用している場合は、先行ゼロを持つものを除外する最適な方法は何ですか?現在、すべての組み合わせを生成し、後でループし、サブセットが有効な場合にのみ続行します。簡単にするために、私はサンプルコードでサブセットを印刷しています。作成されたジェネレータが非常に長いと仮定するか、またはそれが多くの無効なサブセットを拘束する場合、ジェネレータ全体をループすることはほとんど無駄です。無効な項目(先行ゼロがあるもの)が表示されたときにジェネレータを停止し、 '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)
'filter'組み込み関数を見たことがありますか? –
@aryamccarthy:Python 2では、 'filter'は熱心で、ジェネレータではなくリストを返します。 – 9000
Python 2には、遅延評価のための 'itertools.ifilter'があります。 Python 2のタグは表示されません。 –