使用map处理Python中的对象列表
我想用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函数来计算质心呢?