现在我有vector3值表示为列表。有没有办法减去2这些像vector3值,如在Python中减去2个列表
[2,2,2] - [1,1,1] = [1,1,1]
我应该使用元组?
如果它们中没有一个在这些类型上定义这些操作数,我可以定义它吗?
如果不是,我应该创建一个新的vector3类吗?
现在我有vector3值表示为列表。有没有办法减去2这些像vector3值,如在Python中减去2个列表
[2,2,2] - [1,1,1] = [1,1,1]
我应该使用元组?
如果它们中没有一个在这些类型上定义这些操作数,我可以定义它吗?
如果不是,我应该创建一个新的vector3类吗?
如果这是你最终经常做的事情,并用不同的操作,您可能需要创建一个类来处理像这样的情况下,或更好地使用一些库,如Numpy。
否则,寻找与zip内建函数使用list comprehensions:
[a_i - b_i for a_i, b_i in zip(a, b)]
如果你有两个列表称为“A”和“B”,你可以这样做:[m - n for m,n in zip(a,b)]
如果您计划执行的不仅仅是一个简单的内衬,最好是实施您自己的班级,并在适用于您的案例时重写相应的操作员。
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
如果你的列表是a和b,你可以这样做:
map(int.__sub__, a, b)
但你可能不应该。没有人会知道这意味着什么。
这是很酷的答案。 – garej 2017-04-09 05:31:40
下面是列表推导的替代方案。 Map迭代遍历列表(后面的参数),同时进行,并将它们的元素作为参数传递给函数(第一个arg)。它返回结果列表。
map(operator.sub, a, b)
此代码,因为有较少的语法(这对我来说更美观),显然它是长度为5的名单(见bobince的评论)提高了40%。不管怎样,这两种解决方案都可行
稍微不同的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)
试试这个。
:
list(numpy.array(list1)-numpy.array(list2))
如果不删除列表
import numpy as np
a = [2,2,2]
b = [1,1,1]
np.subtract(a,b)
对于曾经在Pycharm上编码的人,它也会复活其他人。
import operator
Arr1=[1,2,3,45]
Arr2=[3,4,56,78]
print(list(map(operator.sub,Arr1,Arr2)))
`[i - j for i,j in zip(a,b)]`更具可读性,并且不会用a和b中的项代替a和b。 – 2012-06-07 07:59:26