2016-10-29 13 views
4

私は関数のリストlistFunc = [g1、g2、g3]を持っています。このリストは、以下のコードで生成される:ここで引数のリスト(Python)の関数リストをマップします

def g(y): 
    def f(x): 
     return x+y; 
    return f; 
listFunc=list(map(g, [1, 2, 3])); 

、Iは、引数のリストを持っているListArg = [4、5、6]。

mapを使用して[g1(4), g1(5), g1(6), g2(4), g2(5), g2(6), g3(4), g3(5), g3(6)]の結果リストを取得するにはどうすればよいですか?

は、私は、次のコードを使用して考えた:

map(lambda x:x(y), listFunc, ListArg) 

しかし、それだけ[g1(4), g2(5), g3(6)]の結果を与えます。

おかげで、あなたはmap()を使用したい場合は

+0

、何が欲しいのは「デカルト積」と呼ばれています。いくつかの(非Pythonの)議論については、http://phrogz.net/lazy-cartesian-product – Phrogz

答えて

5

これがために、節2でリストの内包のための完璧なユースケースである:

>>> def g1(x): return 1*x 
... 
>>> def g2(x): return 2*x 
... 
>>> def g3(x): return 3*x 
... 
>>> funcs = [g1,g2,g3] 
>>> args = [4,5,6] 
>>> [f(a) for f in funcs for a in args] 
[4, 5, 6, 8, 10, 12, 12, 15, 18] 
>>> 

これは際立って読めると極めて機能的である - リストの内包表記は、ハスケルから借りました。あなたはマップを使用するには、いくつかの深い必要性を感じた場合は

、あなたはこのようにそれをアプローチする必要があります:極めて読めない、おそらく遅く

>>> import itertools 
>>> list(map(lambda f,a : f(a), *zip(*itertools.product(funcs,args)))) 
[4, 5, 6, 8, 10, 12, 12, 15, 18] 

はどれ。リスト内包はここで勝つ。

+1

どういうわけか、私はOPがリスト内包を知っていたが、とにかく 'map'を使いたいと思っていたという質問に続けました。 – chepner

5

は、あなたができる:

>>> [k for item in map(lambda x: [g(x) for g in listFunc], ListArg) for k in item] 
[5, 6, 7, 6, 7, 8, 7, 8, 9] 
+0

を参照してください。あなたの 'listFunc'と' ListArg'は入れ替えられます。 'g1(4)、g1(5)、... 'が最初に必要だったとき、コードは' g1(4)、g2(4)、... 'を計算します。 :-) –

3

あなたはかなりだけmapでこれを行うことはできませんが、他で巣1つの通話をすることができ、結果をフラット化するにはsumを使用します。

>>> sum(map(lambda x : map(lambda f: f(x), ListArg),listFunc), []) 
[5, 6, 7, 6, 7, 8, 7, 8, 9] 
+0

+1この回答が大好きです。しかし、あなたのマップは後方です。 g1(4)、g2(4)、g3(4)、g1(5)、g1(6)、g2 )、g1(5)、g2(5)、... –

+0

ああ、厄介なのは '+'が可換性だからです:) 2つのリストを交換するだけです。 – chepner

3

itertools.productは、私が思い付くことができ、リスト内包表記の唯一の選択肢がある

def g(y): 
    def f(x): 
     return x+y 
    return f 
funcs = map(g, [1, 2, 3]) 
args = [4,5,6] 
p = itertools.product(funcs, args) 
r = [f(arg) for f, arg in p] 

を支援します。今後の参考のため

def foo(args): 
    f, a = args 
    return f(a) 
r = list(map(foo, p)) # using p from above 
+0

気にしないで、何とかそこになかった何かを見ました。コメントを明確にするためにコメントを削除します。同じことをしたいかもしれません。 – Phrogz

関連する問題