【问题标题】:Using map to process a list-of-objects in python在 python 中使用 map 处理对象列表
【发布时间】:2010-10-15 10:44:07
【问题描述】:

我想使用 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    

【问题讨论】:

    标签: python list map


    【解决方案1】:

    除非你放弃你对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 函数计算质心?

    【讨论】:

    • 它只返回 py2k 中的列表
    • 对,在 py3k 中,如果你想要一个列表,你必须写 list(map()) ;)
    【解决方案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,那就没问题了。

    对于其他情况(大多数情况),使用list-comprehension 样式被认为是可取的或强制性的,如其他一些答案所示。

    【讨论】:

    • SumOfMass = map(mass_of, objList) -- 看起来您缺少sum() sumwhere。
    【解决方案3】:
    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 循环。

    【讨论】:

    • 这只是 py2k 中的一个 for 循环。在 py3k 中,它是一个迭代器制造商。
    • map 是更高级别的函数。
    • @John:从某种意义上说,它是一个 for 循环,它遍历可迭代对象的每个元素。
    • 因此它在语法上与 for 循环不同,因为您必须将函数传递给它,而不是在表达式中使用绑定变量。
    • @intuited:为什么重要?这不是我的评论。
    猜你喜欢
    • 2011-07-22
    • 2016-07-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多