是否可以有条件地省略一些产生的值?

Is it possible to conditionally omit some of values yielded?

我有一个用于生成(假)json 数据的生成器函数。为了提供更好的数据多样性,我想以编程方式设置生成或不生成哪些节点。有没有办法在每个 yield 的模板行周围包装逻辑?我意识到整个 yield 可以包含在逻辑中,但是排列的数量会使它变得麻烦。

def json_generator(length):
    for x in range(length):
        yield {'node1': x,
               'node2': x,
               'node3': x
               }

对于这个用例,我是否最好将每个节点附加到一个字符串,并围绕附加逻辑?

您似乎在寻找 algorithm/process

  • 找出排除节点的规则
  • 将节点放入 Pandas 系列
  • 使用 Numpy 随机方法之一生成布尔数组 - 可能使用某种加权来实现您的规则
  • 使用布尔数组 index/select 节点系列中的项目
    • 将结果与任何其他文本连接起来形成一个字符串并生成它

或者将节点保留在列表中并使用 built-in 随机方法来选择节点的子集。从切割后幸存下来的字符串构建一个字符串。

你说的好像是这个:

def json_generator(length, add1=True, add2=True, add3=True):
    for x in range(length):
        r = {}
        if add1: r['node1'] = x
        if add2: r['node2'] = x
        if add3: r['node3'] = x
        yield r

for x in json_generator(10, False, True, True):
    print(x)

结果:

{'node2': 0, 'node3': 0}
{'node2': 1, 'node3': 1}
{'node2': 2, 'node3': 2}
{'node2': 3, 'node3': 3}
{'node2': 4, 'node3': 4}
{'node2': 5, 'node3': 5}
{'node2': 6, 'node3': 6}
{'node2': 7, 'node3': 7}
{'node2': 8, 'node3': 8}
{'node2': 9, 'node3': 9}

如果您仅使用 length 参数创建生成器,这将保留原始行为。