现在我有vector3值表示为列表。有没有一种方法可以减去其中两个类似的vector3值,例如
[2,2,2] - [1,1,1] = [1,1,1]
我应该使用元组吗?
如果没有一个在这些类型上定义这些操作数,我可以改为定义它吗?
如果没有,我应该创建一个新的vector3类吗?
现在我有vector3值表示为列表。有没有一种方法可以减去其中两个类似的vector3值,例如
[2,2,2] - [1,1,1] = [1,1,1]
我应该使用元组吗?
如果没有一个在这些类型上定义这些操作数,我可以改为定义它吗?
如果没有,我应该创建一个新的vector3类吗?
Answers:
这是列表理解的替代方法。Map会同时遍历列表(后一个参数),并同时将其元素作为参数传递给函数(第一个arg)。它返回结果列表。
map(operator.sub, a, b)
这段代码的语法较少(对我来说更美观),对于长度为5的列表,它的速度显然要快40%(请参阅bobince的评论)。不过,任何一种解决方案都行得通。
如果有两个名为“ 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( (a-b for a,b in zip(self.data, other.data) ) )
Vector(1, 2, 3) - Vector(1, 1, 1)
如果您计划执行多个简单的班轮,最好实现自己的类并覆盖适用于您的情况的适当运算符。
取自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
对于曾经在Pycharm上编码的人来说,它也使其他人复活。
import operator
Arr1=[1,2,3,45]
Arr2=[3,4,56,78]
print(list(map(operator.sub,Arr1,Arr2)))
arr1=[1,2,3]
arr2=[2,1,3]
ls=[arr2-arr1 for arr1,arr2 in zip(arr1,arr2)]
print(ls)
>>[1,-1,0]
此答案显示了如何编写“正常/易于理解”的pythonic代码。
我建议不要使用,zip
因为并非所有人都知道这一点。
该解决方案使用列表推导和常见的内置函数。
a = [2, 2, 2]
b = [1, 1, 1]
result = [a[i] - b[i] for i in range(len(a))]
推荐使用,因为它仅使用Python中最基本的功能
a = [2, 2, 2]
b = [1, 1, 1]
result = [x - b[i] for i, x in enumerate(a)]
a = [2, 2, 2]
b = [1, 1, 1]
result = list(map(lambda x, y: x - y, a, b))
试试这个:
list(array([1,2,3])-1)