201

add次のような関数があるとしましょう

def add(x, y):
    return x + y

配列に map 関数を適用したい

map(add, [1, 2, 3], 2)

セマンティクスは、配列のすべての要素に 2 を追加したいです。ただし、このmap関数には 3 番目の引数にもリストが必要です。

注:add簡単にするために例を示しています。私の本来の機能はもっと複雑です。yもちろん、関数内のデフォルト値を設定するオプションは、add呼び出しごとに変更されるため、問題外です。

4

15 に答える 15

239

1 つのオプションはリスト内包表記です。

[add(x, 2) for x in [1, 2, 3]]

より多くのオプション:

a = [1, 2, 3]

import functools
map(functools.partial(add, y=2), a)

import itertools
map(add, a, itertools.repeat(2, len(a)))
于 2012-05-31T13:50:19.020 に答える
87

ドキュメントは、これが主な用途であることを明示的に示唆していますitertools.repeat:

オブジェクトを何度も返すイテレータを作成します。times 引数が指定されない限り、無期限に実行されます。map()呼び出された関数への不変パラメータの引数として使用されます。またzip()、タプル レコードの不変部分を作成するためにも使用されます。

len([1,2,3])また、times引数としてpass を使用する理由はありません。map最初の iterable が消費されるとすぐに停止するため、無限の iterable はまったく問題ありません。

>>> from operator import add
>>> from itertools import repeat
>>> list(map(add, [1,2,3], repeat(4)))
[5, 6, 7]

repeat実際、これはドキュメントの例と同等です:

>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

これにより、Python イテレータの用語でも完全に読みやすい、遅延関数型言語の優れたソリューションが実現します。

于 2014-11-19T19:28:42.983 に答える
44

リスト内包表記を使用します。

[x + 2 for x in [1, 2, 3]]

本当に本当に本当にを使用したい場合mapは、最初の引数として無名関数を指定します。

map(lambda x: x + 2, [1,2,3])
于 2012-05-31T13:50:03.503 に答える
22

正解は思ったより簡単です。単に行う:

map(add, [(x, 2) for x in [1,2,3]])

add の実装をタプルを取るように変更します。

def add(t):
   x, y = t
   return x+y

これにより、両方の追加パラメーターが動的である複雑なユースケースを処理できます。

于 2016-04-27T11:20:08.237 に答える
16

クロージャーを使用して、同様の状況 ( pandas.applyメソッドの使用など)を解決することもありました。

それらを使用するには、関数のラッパーを動的に定義して返す関数を定義し、パラメーターの 1 つを効果的に定数にします。

このようなもの:

def add(x, y):
   return x + y

def add_constant(y):
    def f(x):
        return add(x, y)
    return f

次に、任意の値add_constant(y)に追加するために使用できる関数を返します。y

>>> add_constant(2)(3)
5

これにより、パラメーターが一度に 1 つずつ与えられるあらゆる状況で使用できます。

>>> map(add_constant(2), [1,2,3])
[3, 4, 5]

編集

クロージャー関数を別の場所に記述したくない場合は、ラムダ関数を使用してオンザフライでビルドする可能性が常にあります。

>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]
于 2015-08-18T11:56:46.300 に答える
14

利用できる場合は、numpyの使用を検討します。これらのタイプの操作では非常に高速です。

>>> import numpy
>>> numpy.array([1,2,3]) + 2
array([3, 4, 5])

これは、実際のアプリケーションが数学演算(ベクトル化可能)を実行していることを前提としています。

于 2012-05-31T13:55:51.747 に答える
11

本当に map 関数を使用する必要がある場合 (ここでの私のクラス割り当てのように...)、引数を 1 つ持つラッパー関数を使用して、残りを本体の元の関数に渡すことができます。すなわち:

extraArguments = value
def myFunc(arg):
    # call the target function
    return Func(arg, extraArguments)


map(myFunc, itterable)

汚い&醜い、それでもうまくいく

于 2014-10-06T19:35:17.707 に答える
-1
#multi argument

def joke(r):
     if len(r)==2:
          x, y = r
          return x + y
     elif len(r)==3:
           x,y,z=r
           return x+y+z

#using map

    print(list(map(joke,[[2,3],[3,4,5]])))

出力 = [6,12]

上記のような場合で、単に関数を使用したい場合

def add(x,y):
    ar =[]
    for xx in x:
         ar.append(xx+y)
    return ar
print(list(map(add,[[3,2,4]],[2]))[0])
output = [5,4,6]

注:必要に応じて変更できます。

于 2020-08-28T09:24:03.723 に答える