这就是我想要做的事情
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元组。我该怎么做?
答案 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))