使用map处理Python中的对象列表

2 投票
3 回答
7023 浏览
提问于 2025-04-16 05:32

我想用map函数来计算质心。我不想使用for循环。能帮我看看下面这两行代码吗?

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    

3 个回答

2

如果你真的不想用 for 循环,可以试试 operator 模块里的 attrgetter 函数。比如:

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

不过,这样做其实不太符合 Python 的风格(就像用 camelCase 命名变量一样——通常你应该用 like_this 这种方式)。如果你需要访问的东西已经是一个函数,并且这个函数只需要序列中的一个元素作为参数,那么用 map 是可以接受的。换句话说,如果你能直接用 map(some_function, sequence) 而不需要像上面那样费劲去获取 some_function,那就没问题。

对于其他情况(大多数情况都是这样),使用 列表推导式 的方式被认为是更好或者是必须的,像其他一些答案中展示的那样。

2
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 只接受整数作为参数。

顺便说一下,map 就是一个 for 循环。

3

如果你不放下对for循环的偏见,就无法完成最后两行代码。

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呢?为什么想通过map函数来计算质心呢?

撰写回答