在python中,如何拆分元组并作为map函数的单独参数传递

时间:2014-10-12 20:12:11

标签: python

这就是我想要做的事情

class Vertex:
  def __init__(self, x,y):
    # ...

coords = [(0,0),(10,10)]
v0, v1 = map(lambda x,y: Vertex(x,y), coords)

上面的代码不起作用,因为coord元组以x传递,y

没有任何内容

有效的解决方法是

class Vertex:
  def __init__(self, x,y):
    # ...

coords = [(0,0),(10,10)]
v0, v1 = map(lambda coord: Vertex(coord[0],coord[1]), coords)

但是第一个解决方案看起来更优雅。可能我要添加一个额外的步骤来分割coord元组。我该怎么做?

3 个答案:

答案 0 :(得分:2)

您可以使用tuple-unpacking来调用Vertex构造函数:

coord = (0, 0)
Vertex(*coord)

或者你的例子:

v0, v1 = map(lambda coord: Vertex(*coord), coords)

或者,既然你在Python 2上,你也可以让lambda接受一个元组:

v0, v1 = map(lambda (x, y): Vertex(x, y), coords)

您可以使用列表推导来创建Vertex对象,而不是调用map(实际上在Python 3中返回生成器,因此您的代码无法在那里工作),

v0, v1 = [Vertex(*coord) for coord in coords]

# or unpack the coordinates as suggested by NPE
v0, v1 = [Vertex(x, y) for x, y in coords]

答案 1 :(得分:2)

只需在(x, y)附近加上括号:

v0, v1 = map(lambda (x,y): Vertex(x,y), coords)
#                   ^   ^

编辑:事实证明以上在Python 3(PEP 3113)中不起作用。

以下生成器表达式将在Python 2和3中都有效:

v0, v1 = (Vertex(x, y) for x, y in coords)

答案 2 :(得分:0)

使用zip以及unpack operator *:

map(Vertex, *zip(*coords))

另外,您的__init__签名可能是错误的,因为我认为它错过了self参数:

>>> class Vertex:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __repr__(self):
...         return 'vertex({}, {})'.format(self.x, self.y)
... 
>>> 
>>> coords = [(1, 2), (3, 4)]
>>> tuple(map(Vertex, *zip(*coords)))
(vertex(1, 2), vertex(3, 4))