Вычитание 2 списков в Python
сейчас у меня есть Vector3 значения, представленные в виде списков. есть ли способ вычесть 2 из этих значений, таких как vector3, например
[2,2,2] - [1,1,1] = [1,1,1]
должен ли я использовать кортежи?
Если ни один из них не определяет эти операнды этих типов, я могу определить это?
если нет, должен ли я создать новый класс vector3?
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.
немного другой векторный класс.
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)))