7

私はitertools、非常に強力なモジュールのように思われる について読んでいます。私はitertools.product()、反復可能な入力のすべての組み合わせを私に与えるように見えるものに特に興味があります。

ただし、各出力がどの入力イテラブルから来ているのか知りたいです。たとえば、簡単な標準的な例は次のとおりです。

itertools.product([1, 2, 3], [1, 2])

ユーザーが[1,2,3]、[1、2]の入力を提供した場合、それらがどの順序で入力されたかわからないため、次の結果が得られます

(1, 2)

どちらに転ぶかわからないので、あまり役に立ちません。次のような入力を提供する方法はありますか?

itertools.product(foo = [1, 2, 3], bar = [1, 2])

そして、次のような出力を取得します。

output['foo'] = 1
output['bar'] = 2

また

output.foo = 1
output.bar = 2
4

2 に答える 2

20

の出力は、最初の要素がからのものであり、2番目の要素がからのものでitertools.product([1, 2, 3], [1, 2])あるかどうかに関係なく、一連の順序対です。これは保証された動作です。[1,2,3][1,2]

フィールド名が必要な場合は、結果を名前付きタプルにキャストできます。要求に応じて、名前付きタプルを使用すると、output.fooおよびを使用してフィールドにアクセスできますoutput.bar。KennyTMの使用のアイデアを取り入れて**items、高速でメモリ効率の高い単一の関数にパッケージ化できます。

from itertools import product, starmap
from collections import namedtuple

def named_product(**items):
    Product = namedtuple('Product', items.keys())
    return starmap(Product, product(*items.values()))

呼び出し例は次のとおりです。

>>> for output in named_product(foo=[1,2,3], bar=[1,2]):
        print output

Product(foo=1, bar=1)
Product(foo=1, bar=2)
Product(foo=2, bar=1)
Product(foo=2, bar=2)
Product(foo=3, bar=1)
Product(foo=3, bar=2)
于 2012-02-01T15:15:42.367 に答える
5

(1, 2)結果は常に product の引数の順序、つまりthe 1must come from[1,2,3]と the 2must come fromに従って順序付けられます[1,2]

したがって、itertools.product を再利用することで要件を満たすことができます。

def named_product(**items):
    names = items.keys()
    vals = items.values()
    for res in itertools.product(*vals):
        yield dict(zip(names, res))
于 2012-02-01T15:17:58.790 に答える