2

マップ関数を一度に複数の値に適用することは可能ですか?

このようなもの

from collections import defaultdict
d['a'] = [1,2,3,4]
d['b'] = [4,5,6,7]
d['a'], d['b'] = map(lambda x,y: (x,y) if x*y % 3 == 0 else (0,0), d['a'], d['b'])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-129-5191c9205e6f> in <module>()
----> 1 d['a'], d['b'] = map(lambda x,y: (x,y) if x*y % 3 == 0 else (0,0), d['a'], d['b'])

ValueError: too many values to unpack

もちろん、これを個別に行うことも可能です。

 l = map(lambda x,y: x if x*y % 3 == 0 else 0, d['a'],d['b'])
 m = map(lambda x,y: x if x*y % 3 == 0 else 0, d['b'],d['a'])
 d['a'] = l
 d['b'] = m

 d
 defaultdict(<type 'list'>, {'a': [0, 0, 3, 0], 'b': [0, 0, 6, 0]})
4

4 に答える 4

3

関数に2つ以上の値をとらせる方法を考えることはできませんmap(誰かがこのスレッドでそれを見せてくれることを願っています)。zipしかし、リストジェネレータとsの助けを借りて、必要なものを正確に達成することができます。

from collections import defaultdict

d = {}
d['a'] = [1,2,3,4]
d['b'] = [4,5,6,7]
d['a'], d['b'] = [list(x) for x in zip( *[(x,y) if x*y % 3 == 0 else (0,0) for (x,y) in zip(d['a'], d['b'])])]

d['a']とd['b']をリストにする必要がない場合は、最後の行を少し簡単にすることができます。

d['a'], d['b'] = zip( *[(x,y) if x*y % 3 == 0 else (0,0) for (x,y) in zip(d['a'], d['b'])])
于 2013-02-12T05:43:21.393 に答える
1

はい、を使用してそれを行うことができますzip。しかし、それはあまりpythonicではないようです:

from collections import defaultdict
d = defaultdict(list)
d['a'] = [1,2,3,4]
d['b'] = [4,5,6,7]
d['a'], d['b'] = zip(*map(lambda (x,y): (x,y) if x*y % 3 == 0 else (0,0),
                                                   zip(d['a'], d['b'])))
#out: defaultdict(<type 'list'>, {'a': (0, 0, 3, 0), 'b': (0, 0, 6, 0)})

正確な出力を取得するには:

d['a'], d['b'] = map(list,zip(*map(lambda (x,y): (x,y) if x*y % 3 == 0 else (0,0), 
                                                           zip(d['a'], d['b']))))
#out: defaultdict(<type 'list'>, {'a': [0, 0, 3, 0], 'b': [0, 0, 6, 0]})
于 2013-02-12T05:41:44.760 に答える
0

あなたがやろうとしていることがこれであるならば:

>>> a['b'] = None
>>> a['c'] = None
>>> a['b'], a['c'] = (1,2)
>>> a['b']
1
>>> a['c']
2

はい、可能ですが、関数が何をmap返しているかをもう一度確認する必要があるかもしれません。

于 2013-02-12T05:42:51.983 に答える
0

引数が整数または浮動小数点数であり、関数が算術標準演算を使用して表現できる場合は、その目的で配列を使用することもできます

from numpy import array

x_vals = array([1,2,3,4])
y_vals = array([4,5,6,7])
f = lambda x,y: (x*y % 3 == 0)*x

f(x_vals,y_vals)
>>> array([0, 0, 3, 0])
于 2013-02-12T08:42:16.190 に答える