python - 过滤掉生成器

标签 python filter generator

从生成器中过滤掉某些子集的最佳方法是什么。例如,我有一个字符串“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)

最佳答案

过滤简单且明显的条件(例如“无前导零”),可以在组合构建级别更有效地完成。

def generate_pieces(input_string, predicate):
    if input_string:
        if predicate(input_string):
            yield [input_string]
        for item_size in range(1, len(input_string)+1):
            item = input_string[:item_size]
            if not predicate(item):
                continue
            rest = input_string[item_size:]
            for rest_piece in generate_pieces(rest, predicate):
                yield [item] + rest_piece

生成各种剪辑组合,只要它一点都不好笑:

>>> list(generate_pieces('10002', lambda x: True))
[['10002'], ['1', '0002'], ['1', '0', '002'], ['1', '0', '0', '02'], ['1', '0', '0', '0', '2'], ['1', '0', '00', '2'], ['1', '00', '02'], ['1', '00', '0', '2'], ['1', '000', '2'], ['10', '002'], ['10', '0', '02'], ['10', '0', '0', '2'], ['10', '00', '2'], ['100', '02'], ['100', '0', '2'], ['1000', '2']]

仅那些没有前导零的片段:

>>> list(generate_pieces('10002', lambda x: not x.startswith('0')))
[['10002'], ['1000', '2']]

递归步骤从未考虑以零开头的子字符串。

关于python - 过滤掉生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43899030/

相关文章:

python - 屏幕抓取 Facebook 中的好友列表,适用于 Python

filter - 隐藏筛选器中的值 - Tableau

angular - 在Angular 6中通过http get处理复杂对象

python - Keras适合生成器-ValueError : Failed to find data adapter that can handle input

python - 将数据表拆分为许多小数据表 Python

python - Django Rest Framework -- 没有名为 rest_framework 的模块

python - 按日期字符串选择 DataFrame 切片

java - Primefaces 一个数据表过滤器用于两个表

generator - 在 Opendaylight 中使用 YANG Tools 作为 MD-SAL 的 Java 代码生成器

python - 在 python 中为生成器计算均值