Subtrahieren 2 Listen in Python
Frage
Im Moment habe ich dargestellten Werte als Listen Vector3. gibt es eine Möglichkeit, 2 davon wie vector3 Werte zu subtrahieren, wie
[2,2,2] - [1,1,1] = [1,1,1]
Soll ich Tupeln?
Wenn keiner von ihnen definiert diese Operanden auf diese Art, kann ich es definieren stattdessen?
Wenn nicht, sollte ich eine neue vector3 Klasse?
Lösung
Ist dies etwas, das Sie häufig am Ende tut, und mit verschiedenen Operationen, sollten Sie vielleicht eine Klasse erstellen, um Fälle wie diese handhaben, oder besser eine Bibliothek verwenden wie Numpy .
Ansonsten sucht Listenkomprehensionen verwendet mit der zip eingebaute Funktion:
[a_i - b_i for a_i, b_i in zip(a, b)]
Andere Tipps
Hier ist eine alternative Comprehensions aufzulisten. Karte durchläuft die Liste (n) (letztere Argumente), so unerwuenscht tun, und übergibt ihre Elemente als Argumente für die Funktion (die erste arg). Es liefert die resultierende Liste.
map(operator.sub, a, b)
Dieser Code weil weniger Syntax (die für mich mehr Ästhetik ist), und anscheinend ist es 40% schneller für die Listen der Länge 5 (bobince Kommentar sehen). Dennoch wird entweder Lösung arbeiten.
Wenn Sie Ihre Listen a und b sind, können Sie tun:
map(int.__sub__, a, b)
Man sollte aber wahrscheinlich nicht. Niemand wird wissen, was es bedeutet.
Ich würde empfehlen NumPy als auch
Es ist nicht nur schneller für Vektor-Mathematik zu tun, aber es hat auch eine Tonne Komfortfunktionen.
Wenn Sie etwas wollen noch schneller für 1d Vektoren, versuchen VOP
Es ist ähnlich wie Matlab, aber frei und solche Sachen. Hier ist ein Beispiel dafür, was man tun würde
from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]
Boom.
Wenn Sie zwei Listen namens ‚a‘ und ‚b‘ können Sie tun: [m - n for m,n in zip(a,b)]
Eine etwas andere Vector-Klasse.
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)
Wenn Sie auf Ausführen mehr als einfache Einzeiler planen, wäre es besser, Ihre eigene Klasse zu implementieren und die entsprechenden Operatoren außer Kraft setzen, da sie auf Ihren Fall anwenden.
Genommen von Mathematik in 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)
Für die, die verwendeten PyCharm zu kodieren, sie belebt auch andere als gut.
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]
Die Kombination von map
und lambda
Funktionen in Python ist eine gute Lösung für diese Art von Problem:
a = [2,2,2]
b = [1,1,1]
map(lambda x,y: x-y, a,b)
zip
Funktion ist eine gute Wahl, wie gezeigt, durch @UncleZeiv
Versuchen Sie folgendes:
list(array([1,2,3])-1)