1

タプルのリストを返す関数があり、それを反復処理したい:

def get_parameter_product(num_parameters, lower_range, upper_range):
    param_lists = [ xrange(lower_range, upper_range) for _ in xrange(num_parameters)]   
    return list(itertools.product(*param_lists))

for p in get_parameter_product(3, 0, 5):
    print p,

(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), ... , (4, 4, 2), (4, 4, 3), (4, 4, 4)

ただし、num_parameters の値を大きくすると、割り当てに多くのメモリが必要になります。これをジェネレーターに変換することは可能ですか?

4

3 に答える 3

2

itertools.productすでにジェネレーターです。リストに変換する代わりに、それを返すことができます。

于 2012-11-19T23:18:57.910 に答える
2

あなたの方法は、不要な余分なステップを追加しています。

prod_list = get_parameter_product(3, 0, 5)

で置き換えることができます

prod_genr = product(range(0, 5), repeat=3)

inはoritertoolsではなくジェネレータを返します。orとは対照的に、ドキュメントを見て、本当に必要かどうかを確認することをお勧めします。listtupleproductcombinationspermutations

于 2012-11-19T23:33:33.193 に答える
0

リストをジェネレーターに変換する必要はありません。ジェネレーターをリストに変換しないでください。

まず、ビルドするparam_listsには、リスト内包表記の代わりにジェネレータ式を使用します。リストの代わりにイテレータがあります。

list次に、returnステートメントを呼び出さないでください。

>>> def get_parameter_product(num_parameters, lower_range, upper_range):
...     param_lists = (xrange(lower_range, upper_range) for _ in xrange(num_parameters))
...     return itertools.product(*param_lists)
>>> p = get_parameter_product(3, 0, 5)
>>> print(p)
<generator object <genexpr> at 0x101d650f0>
>>> print(list(p))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), ... , (4, 4, 2), (4, 4, 3), (4, 4, 4)]
于 2012-11-19T23:18:16.550 に答える