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?

61
demandé sur SilentGhost 2009-02-11 02:57:22

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)]
105
répondu UncleZeiv 2014-05-28 20:22:29

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.

70
répondu Nikhil Chelliah 2009-02-11 21:21:15

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.

10
répondu recursive 2009-02-11 00:17:55

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.

10
répondu mikelikespie 2009-02-11 07:59:28

Consultez le paquetNumPy pour python.

8
répondu George 2009-02-11 00:01:51

Si vous avez deux listes " a " et "b", vous pouvez le faire: [m - n for m,n in zip(a,b)]

5
répondu Andy Mikula 2009-02-10 23:59:49

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)
4
répondu S.Lott 2009-02-11 02:44:23

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
3
répondu codelogic 2009-02-11 00:03:52
import numpy as np
a = [2,2,2]
b = [1,1,1]
np.subtract(a,b)
1
répondu user3503711 2017-11-09 20:38:35

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)))
1
répondu Sahil Nagpal 2018-02-08 17:44:28

Si vous voulez le résultat dans la liste :

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

Sinon supprimer la liste.

0
répondu hamed 2014-04-30 13:31:36
arr1=[1,2,3]
arr2=[2,1,3]
ls=[arr2-arr1 for arr1,arr2 in zip(arr1,arr2)]
print(ls)
>>[1,-1,0]
0
répondu ravi tanwar 2018-07-21 04:18:39

Essayez ceci:

list(array([1,2,3])-1)
-1
répondu Rostyslav Dzinko 2012-08-28 20:32:08