문제
지금은 벡터 3 값이 목록으로 표시됩니다. Vector3 값과 같은 2 개를 빼는 방법이 있습니까?
[2,2,2] - [1,1,1] = [1,1,1]
튜플을 사용해야합니까?
이 유형에서 이러한 피연산자를 정의하지 않으면 대신 정의 할 수 있습니까?
그렇지 않은 경우 새 Vector3 클래스를 만들어야합니까?
해결책
이것이 당신이 자주하는 일이되고 다른 작업을 통해 이와 같은 케이스를 처리 할 수있는 클래스를 만들거나 같은 라이브러리를 더 잘 사용해야합니다. Numpy.
그렇지 않으면 찾으십시오 이해력을 나열하십시오 와 함께 사용됩니다 지퍼 내장 기능 :
[a_i - b_i for a_i, b_i in zip(a, b)]
다른 팁
다음은 이해력을 나열하는 대안입니다. 맵은 목록을 반복하여 (후자의 인수) 동시에 수행하고 그 요소를 기능 (첫 번째 Arg)에 인수로 전달합니다. 결과 목록을 반환합니다.
map(operator.sub, a, b)
이 코드는 구문이 적기 때문에 (나에게는 더 미적입니다), 길이 5 목록의 경우 40% 더 빠릅니다 (Bobince의 의견 참조). 그럼에도 불구하고 두 솔루션이 모두 작동합니다.
목록이 A와 B 인 경우 다음을 수행 할 수 있습니다.
map(int.__sub__, a, b)
그러나 당신은 아마도 안됩니다. 아무도 그것이 의미하는 바를 알지 못할 것입니다.
'a'와 'b'라는 두 개의 목록이있는 경우 다음을 수행 할 수 있습니다. [m - n for m,n in zip(a,b)]
약간 다른 벡터 클래스.
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)
간단한 하나 이상의 라이너를 수행 할 계획이라면 자신의 클래스를 구현하고 적절한 운영자가 케이스에 적용 할 때 적절한 연산자를 무시하는 것이 좋습니다.
가져 왔습니다 파이썬의 수학:
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
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)))
arr1=[1,2,3]
arr2=[2,1,3]
ls=[arr2-arr1 for arr1,arr2 in zip(arr1,arr2)]
print(ls)
>>[1,-1,0]
의 조합 map
그리고 lambda
파이썬의 기능은 이러한 종류의 문제에 대한 좋은 해결책입니다.
a = [2,2,2]
b = [1,1,1]
map(lambda x,y: x-y, a,b)
zip
기능은 @unclezeiv가 시연 한 바와 같이 또 다른 좋은 선택입니다.
이 시도:
list(array([1,2,3])-1)