web-dev-qa-db-ja.com

Python `map`と引数の解凍

そんなこと知ってる

map(function, arguments)

と同等です

for argument in arguments:
    function(argument)

マップ機能を使用して次のことを行うことはできますか?

for arg, kwargs in arguments:
    function(arg, **kwargs)
28

あなたはラムダでできます:

_map(lambda a: function(a[0], **a[1]), arguments)
_

または、必要に応じて、ジェネレータ式またはリスト内包表記を使用できます。

_(function(a, **k) for a, k in arguments)
[function(a, **k) for a, k in arguments]
_

In Python 2、map()はリストを返します(したがって、リスト内包表記は同等です)、in Python 3、map()はジェネレーターです(ジェネレーター式で置き換えることができます)。

これを直接行う組み込みまたは標準のライブラリメソッドはありません。ユースケースは専門的すぎます。

23
Martijn Pieters

位置引数の場合のみ、itertools.starmap(fun, args)を使用できます。

指定されたシーケンスから取得した引数タプルで評価された関数から値が返されるイテレータを返します。

例:

from itertools import starmap

def f(i, arg):
    print(arg * (i+1))

for _ in starmap(f, enumerate(["a", "b", "c"])):
    pass

プリント:

a
bb
ccc
13
eddygeek

Mapは、引数を個別の引数ではなく1つのタプルとして関数に渡すことを覚えておく必要があります。元の関数を変更できない場合は、ヘルパー関数を使用して呼び出すことができます。

def f(tup):
    args, kwargs = tup
    function(args, **kwargs)

map(f, arguments)
0
DJG

私は同じニーズにぶつかり続け、次の機能を作成することになりました。

def kwarg_map(element_constructor, **kwarg_lists):
    """
    A helper function for when you want to construct a chain of objects with individual arguments for each one.  Can
    be easier to read than a list expansion.

    :param element_constructor: A function of the form object = fcn(**kwargs)
    :param kwarg_lists: A dict of lists, where the index identifies two which element its corresponding value will go.
    :return: A list of objects.

    e.g. Initializing a chain of layers:
        layer_sizes = [784, 240, 240, 10]
        layers = kwarg_map(
            Layer,
            n_in = layer_sizes[:-1],
            n_out = layer_sizes[1:],
            activation = ['tanh', 'tanh', 'softmax'],
            )

    is equivalent to:
        layers = [Layer(n_in=784, n_out=240, activation='tanh'), Layer(n_in=240, n_out=240, activation='tanh'), Layer(n_in=240, n_out=10, activation='softmax')]
    """
    all_lens = [len(v) for v in kwarg_lists.values()]
    assert len(kwarg_lists)>0, "You need to specify at least list of arguments (otherwise you don't need this function)"
    n_elements = all_lens[0]
    assert all(n_elements == le for le in all_lens), 'Inconsistent lengths: %s' % (all_lens, )
    return [element_constructor(**{k: v[i] for k, v in kwarg_lists.iteritems()}) for i in xrange(n_elements)]
0
Peter