파이썬에서 2 개의 목록 빼기


84

지금은 목록으로 표현 된 vector3 값이 있습니다. vector3 값 중 2 개를 빼는 방법이 있습니까?

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

튜플을 사용해야합니까?

이들 중 어느 것도 이러한 유형에 대해 이러한 피연산자를 정의하지 않으면 대신 정의 할 수 있습니까?

그렇지 않다면 새로운 vector3 클래스를 만들어야합니까?

답변:


134

이것이 자주 수행하는 작업이고 다른 작업으로 끝나는 경우 이와 같은 경우를 처리하는 클래스를 만들거나 Numpy 와 같은 일부 라이브러리를 사용하는 것이 좋습니다 .

그렇지 않으면 zip 내장 함수 와 함께 사용되는 목록 이해를 찾으십시오 .

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

83

여기에 목록 이해에 대한 대안이 있습니다. 매핑은 목록 (후자의 인수)을 반복하여 동시에 수행하고 해당 요소를 함수 (첫 번째 인수)에 인수로 전달합니다. 결과 목록을 반환합니다.

map(operator.sub, a, b)

이 코드는 구문이 적기 때문에 (나에게 더 심미적입니다), 길이가 5 인 목록의 경우 40 % 더 빠릅니다 (bobince의 의견 참조). 그래도 두 솔루션 모두 작동합니다.


나는 일반적으로 map ()을 통해 목록 이해가 추천되는 것을 봅니다.하지만 그것은 단지 깔끔한 코드이기 때문일 수 있습니다 ... 성능 차이에 대해 확실하지 않습니다.
David Z

2
map ()은 5 요소 빼기를 위해 Py2.6에서 거의 40 % 더 빨리 나옵니다. 이해력은 람다를 피하는 곳에서 더 새롭고 깨끗하지만 기존 함수 맵을 매핑하는 경우 여전히 예쁘다 ... 특히 내장 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

6

'a'와 'b'라는 두 개의 목록이있는 경우 다음을 수행 할 수 있습니다. [m - n for m,n in zip(a,b)]



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

단순한 하나 이상의 라이너를 수행 할 계획이라면 자신의 클래스를 구현하고 케이스에 적용되는 적절한 연산자를 재정의하는 것이 좋습니다.

에서 촬영 파이썬에서 수학 :

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

2

Pycharm에서 코딩했던 사람에게는 다른 사람도 부활시킵니다.

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

1

Python 의 maplambda함수 조합은 이러한 종류의 문제에 대한 좋은 해결책입니다.

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

0

이 답변은 "보통 / 쉽게 이해할 수있는"파이썬 코드를 작성하는 방법을 보여줍니다.

나는 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))

왜 반대 투표입니까? 내 대답은 독특하고 다른 사람들에게 도움이 될 수 있습니다.
Timmy Chan

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.