【发布时间】: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