Soustraire 2 listes en Python
En ce moment, j'ai des valeurs vector3 représentées sous forme de listes. est-il un moyen de soustraire 2 de ces comme vector3 valeurs, comme
[2,2,2] - [1,1,1] = [1,1,1]
Devrais-je utiliser des tuples?
Si aucun d'entre eux ne définit ces opérandes sur ces types, puis-je le définir à la place?
Si ce n'est pas le cas, devrais-je créer une nouvelle classe vector3?
13 réponses
Si c'est quelque chose que vous finissez par faire fréquemment, et avec des opérations différentes, vous devriez probablement créer une classe pour gérer des cas comme celui-ci, ou mieux utiliser une bibliothèque comme Numpy.
Sinon, recherchez les compréhensions de liste utilisées avec la fonction intégréezip :
[a_i - b_i for a_i, b_i in zip(a, b)]
Voici une alternative aux compréhensions de liste. Map parcourt la liste(les derniers arguments), le faisant simultanément, et transmet leurs éléments en tant qu'arguments à la fonction (le premier arg). Il renvoie la liste résultante.
map(operator.sub, a, b)
CE code car a moins de syntaxe (ce qui est plus esthétique pour moi), et apparemment c'est 40% plus rapide pour les listes de longueur 5 (voir le commentaire de bobince). Pourtant, l'une ou l'autre solution fonctionnera.
Si vos listes a et b, vous pouvez faire:
map(int.__sub__, a, b)
Mais vous ne devriez probablement pas. personne ne saura ce que cela signifie.
Je dois recommander NumPy aussi
Non seulement il est plus rapide pour faire des mathématiques vectorielles, mais il a aussi une tonne de fonctions de commodité.
Si vous voulez quelque chose d'encore plus rapide pour les vecteurs 1d, essayez vop
C'est similaire à MatLab, mais gratuit et d'autres choses. Voici un exemple de ce que vous feriez
from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]
Boum.
Si vous avez deux listes " a " et "b", vous pouvez le faire: [m - n for m,n in zip(a,b)]
Une classe de vecteur légèrement différente.
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)
Si vous prévoyez d'effectuer plus de simples liners, il serait préférable d'implémenter votre propre classe et de remplacer les opérateurs appropriés tels qu'ils s'appliquent à votre cas.
Tiré de mathématiques en 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)
Pour celui qui codait sur Pycharm, cela ravive aussi les autres.
import operator
Arr1=[1,2,3,45]
Arr2=[3,4,56,78]
print(list(map(operator.sub,Arr1,Arr2)))
Si vous voulez le résultat dans la liste :
list(numpy.array(list1)-numpy.array(list2))
Sinon supprimer la liste.
arr1=[1,2,3]
arr2=[2,1,3]
ls=[arr2-arr1 for arr1,arr2 in zip(arr1,arr2)]
print(ls)
>>[1,-1,0]