45

これが私がmap関数を使おうとしているループです:

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
for volume_id in volume_ids:
    my_function(volume_id, ip=ip)

これを行う方法はありますか?パラメータがなければ些細なことipですが、どう対処すればいいのかわかりません。

4

5 に答える 5

89

使用functools.partial()

from functools import partial

mapfunc = partial(my_function, ip=ip)
map(mapfunc, volume_ids)

partial()新しい呼び出し可能オブジェクトを作成します。これは、その新しい呼び出し可能オブジェクトに渡されるものに加えて、ラップされた関数に任意の引数(キーワード引数を含む)を適用します。

于 2012-11-21T18:35:32.157 に答える
16

これがラムダアプローチです(良くない、ただ違う)

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
map(lambda ids: my_function(ids, ip), volume_ids);
于 2012-11-21T18:44:26.810 に答える
8

これは、リスト内包表記を使用して簡単に行うことができます。

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
results = [my_function(i,ip=ip) for i in volume_ids]
于 2014-03-05T22:17:15.343 に答える
2

一般に、mapを使用して、その関数を辞書を解凍するものでラップし、反復可能な辞書をmapに渡すことで、キーワードを関数に渡すことができます。例:

from itertools import product

volume_ids = [1,2,3,4,5]
volume_ids = (("volume_id", volume_id) for volume_id in volume_ids)
ips = [("ip", '172.12.13.122')]
kwargs_iterable = map(dict, product(volume_ids, ips))

result = map(lambda kwargs: my_function(**kwargs), kwargs_iterable)

ただし、特殊なケースの場合、より簡単な解決策は次のようになります。

map(my_function, volume_ids, [ip]*len(volume_ids))

これは簡潔であり、インポートに依存しません。もう1つの可能性は、itertoolsの製品とスターマップを組み合わせることです。

from itertools import product, starmap

ips = [ip]
starmap(my_function, product(volume_ids, ips))

これは、複数のIPアドレスまたは3つ以上の変数を使用する設定にうまく一般化されます。

于 2018-06-02T01:53:11.870 に答える
0

これはどう?

results = []
for volume_id in volume_ids:
    results.append(my_function(volume_id, ip=ip))

これは、1行ではなく3行のコードです---モジュールなどから特殊なケースのヘルパーをインポートする代わりに、3行の明確で明白なコードです。この議論はおそらく好みの問題ですが、誰と話すかによってはかなりの重みがあります。

于 2012-11-21T19:02:03.050 に答える