在Python中减去2个列表
现在我有vector3值表示为列表。 有没有办法减去2这些像vector3值,如
[2,2,2] - [1,1,1] = [1,1,1]
我应该使用元组吗?
如果它们中没有一个在这些types上定义这些操作数,我可以定义它吗?
如果不是,我应该创build一个新的vector3类吗?
如果这是你最终经常做的事情,并且使用不同的操作,你应该创build一个类来处理这种情况,或者更好地使用像Numpy这样的库。
否则,请查找与zip内build函数一起使用的列表推导:
[a_i - b_i for a_i, b_i in zip(a, b)]
这是列表parsing的替代方法。 映射迭代通过列表(后面的参数),同时做这些,并将它们的元素作为parameter passing给函数(第一个参数)。 它返回结果列表。
map(operator.sub, a, b)
这段代码是因为语法较less(对我来说更美观),显然它的长度为5的列表要快40%(见bobince的评论)。 不过,任何解决scheme都可以。
我不得不推荐NumPy
vectormath不仅更快,而且具有许多便利function。
如果你想要更快的一维向量,请尝试vop
这与MatLab类似,但是免费和东西。 这是你要做的一个例子
from numpy import matrix a = matrix((2,2,2)) b = matrix((1,1,1)) ret = a - b print ret >> [[1 1 1]]
繁荣。
如果你的列表是a和b,你可以这样做:
map(int.__sub__, a, b)
但是你可能不应该。 没有人会知道这意味着什么。
查看python的NumPy包。
如果您有两个名为“a”和“b”的列表,您可以执行: [m - n for m,n in zip(a,b)]
稍微不同的Vector类。
class Vector( object ): def __init__(self, *data): self.data = data def __repr__(self): return repr(self.data) def __add__(self, other): return tuple( (a+b for a,b in zip(self.data, other.data) ) ) def __sub__(self, other): return tuple( (ab for a,b in zip(self.data, other.data) ) ) Vector(1, 2, 3) - Vector(1, 1, 1)
如果你打算做的不仅仅是简单的一class,最好是实施你自己的class级,并在适用于你的情况下重写适当的操作员。
从Python中的math中获取 :
class Vector: def __init__(self, data): self.data = data def __repr__(self): return repr(self.data) def __add__(self, other): data = [] for j in range(len(self.data)): data.append(self.data[j] + other.data[j]) return Vector(data) x = Vector([1, 2, 3]) print x + x
如果你想在列表中的结果:
list(numpy.array(list1)-numpy.array(list2))
如果不删除列表。
import numpy as np a = [2,2,2] b = [1,1,1] np.subtract(a,b)
尝试这个:
list(array([1,2,3])-1)