2017-01-03 1 views
1

私はこの機能を持っています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ときに私が使用して痛みがあり、ネストされたイテレータを持って、私はそれを返す使用するときだけだけに対応した発電機を返すということです最初のループターン、ちょうど私がした場合:g()def g(): return product(*next(permutations(list)))で構成されています。

+0

あなたは 'G'ジェネレータを書いていないし、あなただけしたい場合は、あなたがどうなるのかを考えてみてくださいすべての組み合わせで 'some_function(x)'を呼び出してください。そのコードを書いて、 'some_function'を' yield'に置き換えてください。 – user2357112

+0

あなたはどのバージョンのPythonをターゲットにしていますか?(ここから 'yield from 'を使うことができますか?) – snakecharmerb

+0

@snakecharmerb python 3、ああ、そうだね、「収穫量」が忘れている。私は 'c = chain(c、product(* p)) 'を使って問題を解決し、最後にcを返し、それを掲示した直後のアイデア。 – ChiseledAbs

答えて

3

あなたが3.3以降のpythonている場合は、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) 
+0

先端のおかげで歩留まりが忘れて便利です – ChiseledAbs

関連する問題