【问题标题】:How to flatten out the yield when yielding a generator?生成生成器时如何使产量变平?
【发布时间】:2017-05-17 22:23:15
【问题描述】:

我有这个函数g() 我的目标是产生类似于product() 的结果,但每组字符的出现次数受到限制。因此,在下面的代码中,而不是执行 product(a, repeat=3) g() 应该产生所有组合,其中 a 的字符出现 2 次,b 的字符出现 1 次。这是我所拥有的:

from itertools import permutations, product

a='ABC'
b=['*', '%3A']
l=[a]*2+[b]

def g(list):
    for p in permutations(list):
        yield product(*p)


result=g(l)

所以我面临的问题是,当我yield 结果时,我得到了一个使用起来很痛苦的嵌套迭代器,而当我使用 return 时,它只返回与第一个循环转对应的生成器,就好像我做到了:g() 只包含def g(): return product(*next(permutations(list)))

【问题讨论】:

  • 想想如果你不写一个g 生成器你会做什么,而你只是想在每个组合上调用some_function(x)。编写该代码,然后将some_function 替换为yield
  • @snakecharmerb python 3,哦,是的,你说得对,yield from 我完全忘记了,我使用c=chain(c,product(*p)) 解决了这个问题,最后返回 c,在发布之后就有了这个想法.
  • 我注意到如果我使用result=sorted(map(list, g(l)))all(result[i] == result[i+1] for i in range(0, 6, 2)) 就是True。换句话说,您似乎得到了两组相同的结果。你想要吗?
  • @StevenRumbalski 你说得对,谢谢你的观察,有没有办法避免permutations() 在同一个生成器中生成相同的列表?
  • 或者使用from sympy.utilities.iterables import multiset_permutations可能更有效。

标签: python iterator return yield


【解决方案1】:

如果您是 python 3.3 或更高版本,您可以使用 PEP 380: Syntax for Delegating to a Subgenerator ... 只需执行 yield from

from itertools import permutations, product

a='ABC'
b=['*', '%3A']
l=[a]*2+[b]

def g(list):
    for p in permutations(list):
        yield from product(*p)


result=g(l)

【讨论】:

  • 我忘记了收益,感谢您提供有用的提示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2014-03-03
  • 1970-01-01
  • 2020-01-18
  • 2021-10-28
相关资源
最近更新 更多