Вычитание 2 списков в Python


сейчас у меня есть Vector3 значения, представленные в виде списков. есть ли способ вычесть 2 из этих значений, таких как vector3, например

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

должен ли я использовать кортежи?

Если ни один из них не определяет эти операнды этих типов, я могу определить это?

если нет, должен ли я создать новый класс vector3?

13 61

13 ответов:

Если это то, что вы в конечном итоге делаете часто и с различными операциями, вы, вероятно, должны создать класс для обработки таких случаев, или лучше использовать некоторую библиотеку, такую как включает в себя.

в противном случае ищите списочные включения используется элемент zip встроенные функции:

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

вот альтернатива списку понимания. Map перебирает список(ы) (последние аргументы), делая это одновременно, и передает их элементы в качестве аргументов функции (первый arg). Он возвращает результирующий список.

map(operator.sub, a, b)

этот код, потому что имеет меньше синтаксиса (что более эстетично для меня), и, по-видимому, это на 40% быстрее для списков длины 5 (см. комментарий бобинса). Тем не менее, любое решение будет работать.

Если ваши списки a и b, вы можете сделать:

map(int.__sub__, a, b)

но вы, наверное, не стоит. Никто не будет знать, что это значит.

Я бы порекомендовал включает в себя а также

Это не только быстрее для выполнения векторной математики, но и имеет массу удобных функций.

Если вы хотите что-то еще быстрее для 1D векторов, попробуйте ВОП

это похоже на MatLab, но бесплатно и прочее. Вот пример того, что бы вы сделали

from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]

бум.

Проверьте включает в себя пакет для python.

Если у вас есть два списка под названием ' 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)

Если вы планируете выполнять более одного простого лайнера, было бы лучше реализовать свой собственный класс и переопределить соответствующие операторы, как они применяются к вашему случаю.

принято от математика в 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
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)))

Если вы хотите получить результат в списке:

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

если не удалить список.

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

попробуйте это:

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