Python 使用map函数的多重赋值

Python 使用map函数的多重赋值,python,Python,是否可以将映射函数同时应用于多个值 像这样的 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']) ----------------------------------------------------------------------

是否可以将映射函数同时应用于多个值

像这样的

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
从集合导入defaultdict
d['a']=[1,2,3,4]
d['b']=[4,5,6,7]
d['a'],d['b']=map(λx,y:(x,y)如果x*y%3==0其他(0,0),d['a'],d['b']))
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1d['a'],d['b']=map(λx,y:(x,y)如果x*y%3==0其他(0,0),d['a'],d['b']))
ValueError:要解压缩的值太多
当然,单独做这件事是可能的

 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]})
l=map(λx,y:x,如果x*y%3==0,否则为0,d['a'],d['b']))
m=map(λx,y:x,如果x*y%3==0,否则为0,d['b'],d['a']))
d['a']=l
d['b']=m
D
defaultdict(,{'a':[0,0,3,0],'b':[0,0,6,0]})

是的,您可以使用
zip
。不过,它似乎不是很像蟒蛇:

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)})
从集合导入defaultdict
d=默认DICT(列表)
d['a']=[1,2,3,4]
d['b']=[4,5,6,7]
d['a'],d['b']=zip(*map(lambda(x,y):(x,y)如果x*y%3==0其他(0,0),
邮政编码(d['a'],d['b']))
#out:defaultdict(,{'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]})
d['a'],d['b']=map(list,zip(*map)(lambda(x,y):(x,y)如果x*y%3==0,则为其他(0,0),
邮政编码(d['a'],d['b']))
#out:defaultdict(,{'a':[0,0,3,0],'b':[0,0,6,0]})

是的,您可以使用
zip
。不过,它似乎不是很像蟒蛇:

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)})
从集合导入defaultdict
d=默认DICT(列表)
d['a']=[1,2,3,4]
d['b']=[4,5,6,7]
d['a'],d['b']=zip(*map(lambda(x,y):(x,y)如果x*y%3==0其他(0,0),
邮政编码(d['a'],d['b']))
#out:defaultdict(,{'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]})
d['a'],d['b']=map(list,zip(*map)(lambda(x,y):(x,y)如果x*y%3==0,则为其他(0,0),
邮政编码(d['a'],d['b']))
#out:defaultdict(,{'a':[0,0,3,0],'b':[0,0,6,0]})

如果您要做的是:

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

是的,这是可能的,但您可能需要再次查看您的
映射
函数返回的内容。

如果您试图执行以下操作:

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

是的,这是可能的,但您可能需要再次查看
map
函数返回的内容。

我想不出让
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'])])

我想不出让
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'])])

如果您的参数是整数或浮点数,并且您的函数可以使用算术标准运算来表示,那么您也可以使用数组来表示

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])

如果您的参数是整数或浮点数,并且您的函数可以使用算术标准运算来表示,那么您也可以使用数组来表示

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])

是否要就地重新分配值?是否要就地重新分配值?