2010-10-15 11 views
0

Je souhaite calculer le centre de masse à l'aide de la fonction de carte. Je ne veux pas utiliser pour les boucles. Aide avec les deux lignes inférieures?Utilisation de la carte pour traiter une liste d'objets en python

class Obj(): 
    def __init__(self, mass = 0., x = 0., y = 0.):  
     self.mass = mass  
     self.x = x  
     self.y = y  

# Create List of Objects  
objList = [] 
n = 0  
for i in range(0,10):  
    for j in range(0,10):  
     objList.append(Obj(i*j,i,j))  

# Calculate Center of Mass of List 
# The following is pseudocode, does not actually work 
SumOfMass = sum(objList[:].mass)  
CenterOfMassX = sum(objList[:].x.*objList[:].mass)/SumOfMass  

Répondre

1
sumofmass = sum(i.mass for i in objList) 
centre = sum(i.x * i.mass for i in objList)/sumofmass 

aussi, vous pouvez remplir votre objList comme ceci:

objList = [Obj(i*j, i, j) for in range(10) for j in range(10)] 

Notez que range ne prend que des arguments entiers.

P.S. mapest une boucle for.

+0

c'est une boucle for dans py2k seulement. Dans py3k c'est un itérateur. –

+0

'map' est une fonction de niveau supérieur. – intuited

+0

@intuited: est-ce? D'accord. et? – SilentGhost

1

Vous ne pouvez pas faire les deux dernières lignes sauf si vous abandonnez votre préjugé anti-for.

SumOfMass = sum(obj.mass for obj in objList)  
CenterOfMassX = sum(obj.x * obj.mass for obj in objList)/SumOfMass 

Avec py2k (qui vous utilisez?), map(func, alist) équivaut à [func(v) for v in alist] à-dire qu'elle renvoie une liste. Vous avez besoin de deux réponses scalaires, pas un ou deux vecteurs. Qu'est-ce que func aviez-vous en tête? Pourquoi voulez-vous calculer le centre de masse en utilisant la fonction de carte?

+1

il retourne une liste dans py2k seulement – SilentGhost

+0

à droite, dans py3k vous devez écrire la liste (map()) si vous voulez une liste;) – Ant

1

Si vous êtes réellement opposé à l'utilisation de for, vous pouvez utiliser la fonction attrgetter du module operator. .: par exemple

from operator import attrgetter 
mass_of = attrgetter('mass') 
SumOfMass = sum(map(mass_of, objList)) 

Cependant, cela est contraire aux diktats de style Python (comme le fait en utilisant des variables de camelCase - normalement, vous les nommez like_this). Il est plus ou moins acceptable d'utiliser map si la chose à laquelle vous devez accéder est déjà sous la forme d'une fonction qui prend l'élément de séquence comme seul paramètre. En d'autres termes, si vous pouvez appeler map(some_function, sequence) sans avoir à sauter par des cerceaux comme ceux ci-dessus pour obtenir some_function, alors ça va.

Pour d'autres situations (qui sont la plupart d'entre elles), il est préférable ou obligatoire d'utiliser un style list-comprehension comme illustré dans certaines des autres réponses.

+0

' SumOfMass = map (mass_of, objList) '- Il semble que vous manquiez une somme sum() sum. –

+1

Bien résumé. – intuited