用Python减去2个列表


84

现在我有vector3值表示为列表。有没有一种方法可以减去其中两个类似的vector3值,例如

[2,2,2] - [1,1,1] = [1,1,1]

我应该使用元组吗?

如果没有一个在这些类型上定义这些操作数,我可以改为定义它吗?

如果没有,我应该创建一个新的vector3类吗?

Answers:


134

如果您最终经常这样做并且使用不同的操作,则可能应该创建一个类来处理此类情况,或者最好使用Numpy之类的库。

否则,查找与zip内置函数一起使用的列表推导:

[a_i - b_i for a_i, b_i in zip(a, b)]

83

这是列表理解的替代方法。Map会同时遍历列表(后一个参数),并同时将其元素作为参数传递给函数(第一个arg)。它返回结果列表。

map(operator.sub, a, b)

这段代码的语法较少(对我来说更美观),对于长度为5的列表,它的速度显然要快40%(请参阅bobince的评论)。不过,任何一种解决方案都行得通。


我通常会看到在map()上推荐了列表推导,尽管那可能只是因为它的代码看起来更简洁...不确定性能差异(如果有)。
David Z

2
在Py2.6上,对五元素减法来说map()的速度比我快40%。在避免使用lambda的情况下,综合性更高,更清洁,但是对于映射现有功能,map仍然可以很漂亮……尤其是在这里,您可以利用内置的zip。
bobince

1
这也适用于array.array(尽管结果是一个列表)
gens

5
需要“导入运算符”子句;int .__ sub__做的更好。))
garej

13

如果您的列表是a和b,则可以执行以下操作:

map(int.__sub__, a, b)

但是您可能不应该。没有人会知道这意味着什么。


1
自己用花车冲进去。在这种情况下map(float.__sub__, a, b)有效。谢谢你的提示!
S3DEV

9

我不得不建议与NumPy以及

执行向量数学不仅更快,而且还具有大量的便利功能。

如果想要1d向量更快的速度,请尝试使用vop

它与MatLab相似,但是是免费的。这是您要做的事的一个例子

from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]

繁荣。


1
np.array将是一个更简单的解决方案
garej '17



4

一个稍微不同的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( (a-b for a,b in zip(self.data, other.data) ) )

Vector(1, 2, 3) - Vector(1, 1, 1)

3

如果您计划执行多个简单的班轮,最好实现自己的类并覆盖适用于您的情况的适当运算符。

取自Python中的数学

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


1

Python中mapandlambda函数的组合是解决此类问题的好方法:

a = [2,2,2]
b = [1,1,1]
map(lambda x,y: x-y, a,b)

zip 函数是另一个不错的选择,如@UncleZeiv所示


0
arr1=[1,2,3]
arr2=[2,1,3]
ls=[arr2-arr1 for arr1,arr2 in zip(arr1,arr2)]
print(ls)
>>[1,-1,0]

2
尽管此代码段可能是解决方案,但包括说明确实有助于提高帖子的质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
Narendra Jadhav '18

0

此答案显示了如何编写“正常/易于理解”的pythonic代码。

我建议不要使用,zip因为并非所有人都知道这一点。


该解决方案使用列表推导和常见的内置函数。


备选方案1(推荐):

a = [2, 2, 2]
b = [1, 1, 1]
result = [a[i] - b[i] for i in range(len(a))]

推荐使用,因为它仅使用Python中最基本的功能


选择2:

a = [2, 2, 2]
b = [1, 1, 1]
result = [x - b[i] for i, x in enumerate(a)]

备选方案3(如BioCoder所述):

a = [2, 2, 2]
b = [1, 1, 1]
result = list(map(lambda x, y: x - y, a, b))

为什么要投票?我的回答很独特,可以对他人有所帮助。
陈慧娴

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.