在Python中减去2个列表

时间:2009-02-10 23:57:22

标签: python list tuples vector

现在我将vector3值表示为列表。有没有办法减去其中的2个像vector3值,如

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

我应该使用元组吗?

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

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

16 个答案:

答案 0 :(得分:114)

如果这是你最终经常做的事情,并且有不同的操作,你应该创建一个类来处理这样的情况,或者更好地使用像Numpy这样的库。

否则,请查看list comprehensions内置函数使用的zip

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

答案 1 :(得分:78)

这是列表推导的替代方案。 Map迭代遍历列表(后面的参数),同时这样做,并将它们的元素作为参数传递给函数(第一个arg)。它返回结果列表。

map(operator.sub, a, b)

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

答案 2 :(得分:12)

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

map(int.__sub__, a, b)

但你可能不应该这样做。没有人会知道这意味着什么。

答案 3 :(得分:10)

我还需要推荐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]]

动臂。

答案 4 :(得分:6)

如果您有两个名为“a”和“b”的列表,则可以执行以下操作:[m - n for m,n in zip(a,b)]

答案 5 :(得分: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)

答案 6 :(得分:3)

如果您计划执行的不仅仅是简单的一个衬垫,那么最好实现自己的类并覆盖适用于您的案例的相应操作符。

取自Mathematics in 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

答案 7 :(得分:2)

import numpy as np
a = [2,2,2]
b = [1,1,1]
np.subtract(a,b)

答案 8 :(得分:1)

对于曾经在Pycharm上编码的人来说,它也会复活其他人。

 import operator
 Arr1=[1,2,3,45]
 Arr2=[3,4,56,78]
 print(list(map(operator.sub,Arr1,Arr2)))

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

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

所示。

答案 11 :(得分:0)

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

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


这些解决方案使用list comprehensions和常见的内置函数。


替代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))

答案 12 :(得分:0)

已经提出了许多解决方案。

如果您对速度感兴趣,这里是关于速度(从最快到最慢)的不同解决方案的回顾

import timeit
import operator

a = [2,2,2]
b = [1,1,1]  # we want to obtain c = [2,2,2] - [1,1,1] = [1,1,1

%timeit map(operator.sub, a, b)
176 ns ± 7.18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit map(int.__sub__, a, b)
179 ns ± 4.95 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit map(lambda x,y: x-y, a,b)
189 ns ± 8.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit [a_i - b_i for a_i, b_i in zip(a, b)]
421 ns ± 18.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit [x - b[i] for i, x in enumerate(a)]
452 ns ± 17.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each

%timeit [a[i] - b[i] for i in range(len(a))]
530 ns ± 16.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit list(map(lambda x, y: x - y, a, b))
546 ns ± 16.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.subtract(a,b)
2.68 µs ± 80.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit list(np.array(a) - np.array(b))
2.82 µs ± 113 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit np.matrix(a) - np.matrix(b)
12.3 µs ± 437 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

使用 map 显然是最快的。 令人惊讶的是,numpy 是最慢的。事实证明,首先将列表 ab 转换为 numpy 数组的成本是一个瓶颈,超过了矢量化带来的任何效率收益。

%timeit a = np.array([2,2,2]); b=np.array([1,1,1])
1.55 µs ± 54.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

a = np.array([2,2,2])
b = np.array([1,1,1])
%timeit a - b
417 ns ± 12.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

答案 13 :(得分:-1)

试试这个:

list(array([1,2,3])-1)

答案 14 :(得分:-1)

如果您想要结果列表:

list(numpy.array(list1)-numpy.array(list2))

如果不删除列表。

答案 15 :(得分:-1)

非常简单

list1=[1,2,3,4,5]
list2=[1,2]
list3=[]
# print(list1-list2)

for element in list1:
    if element not in list2:
       list3.append(element)

print(list3)