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