【发布时间】:2017-05-10 17:22:07
【问题描述】:
从生成器中过滤掉一些子集的最佳方法是什么。例如,我有一个字符串“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) 如果使用生成器,过滤掉前导零的最佳方法是什么。目前,我生成所有组合,然后循环遍历它,只有在子集有效时才继续。为简单起见,我只打印示例代码中的子集。假设创建的生成器很长,或者如果它包含很多无效的子集,那么循环整个生成器几乎是一种浪费。有没有办法在生成器看到无效项目(前导零)时停止生成器,然后将其从“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是急切的,它返回一个列表,而不是生成器。 -
在 Python 2 中,
itertools.ifilter用于惰性求值。我没有看到 Python 2 标记。 -
正在寻找 python 3 的解决方案,但 python 2 也可以。我如何将“过滤器”集成到“allCombinations”的列表理解中?