2010-10-15 60 views
0

我想使用map函數來計算質心。我不想使用for循環。幫助底部兩行?使用map處理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  

回答

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

也,你可以填充你objList這樣的:

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

注意,那range只需要整數參數。

P.S. map a for循環。

+0

它只是在py2k for循環。在py3k中,它是一個迭代器。 – 2010-10-15 11:17:20

+0

'map'是一個更高級別的函數。 – intuited 2010-10-15 11:19:10

+0

@intuited:是嗎?好。和? – SilentGhost 2010-10-15 11:20:04

1

你不能做最後兩行,除非你放棄你的偏見。

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

隨着py2k(您使用哪個?),map(func, alist)相當於[func(v) for v in alist]即它返回一個列表。你需要兩個標量答案,而不是一個或兩個向量。你記住什麼func?爲什麼要使用地圖功能計算質量​​中心?

+1

它只在py2k中返回一個列表 – SilentGhost 2010-10-15 10:58:05

+0

right,在py3k中你必須寫列表(map())如果你想要一個列表;) – Ant 2010-10-15 11:15:00

1

如果您確實對使用for不以爲然,您可以使用operator模塊中的attrgetter函數。例如: -

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

但是,這樣做有悖於Python的風格使然(使用駝峯變量不 - 通常你他們的名字like_this)。使用map時,如果您需要訪問的東西已經以函數的形式出現,那麼函數會將序列元素作爲其唯一參數,這或多或少是可以接受的。換句話說,如果你可以撥打map(some_function, sequence),而不必像上面那樣跳過任何一個圈來得到some_function,那麼沒關係。

對於其他情況(其中大多數情況),認爲使用list-comprehension樣式更爲可取或強制性,如其他一些答案中的例子。

+0

'SumOfMass = map(mass_of,objList)' - 看起來你錯過了sum()'sumwhere。 – 2010-10-15 11:12:33

+1

很好的總結。 – intuited 2010-10-15 11:16:53

相關問題