如何以Python的方式对对象列表的参数求和



当我使用numpy时,我可以简单地通过写:来求和两个1D数组

    C = A + B

如果我有一个对象列表,并且列表中的所有对象都属于同一类,并且都有三个参数(r、v和a)。如果我想计算列表中所有对象的r = r + v +0.5*a:如果我知道我的所有对象都在一个列表L中,我该如何像在numpy中那样在一行中写这个?

我想是这样的吗?:

    L.r += L.v + 0.5*L.a

您想要的输出有点不清楚。你在找号码列表吗:

[x.r + x.v + .5*x.a for x in L]

这些的总和?

sum([x.r + x.v + .5*x.a for x in L])

还是更改对象本身?

runningSum=0
def mod(obj):
    # How complicated this function is depends on what your trying to accomplish.  
    obj.r = runningSum + obj.r + obj.v + .5*obj.a
    runningSum = obj.r
    return obj
map(mod,L)

如果你不能用两行生存:

[setattr(item,'r',item.r + item.v + 0.5 * item.a) for item in L]

虽然不是一个正式的答案,但我想激发你的好奇心,让你想象一个由你的问题产生的可能性的世界。如果您出于某种原因不想使用numpy,并且只是想知道如何在一行中对列表中的所有元素求和,那么您可能需要重新定义列表之间的操作。这可以通过定义一个非常简单的类来实现,比如下面的类:

class array():
    def __init__(self, mylist):
        self.list = mylist
        return
    def __add__(self, other):
        for i in xrange(len(self.list)):
            self.list[i] += other.list[i]
        return array(self.list)
    def __repr__(self):
        return "%s" % (self.list)

您可以看到该类是使用python列表实例化的,然后我定义了__add__方法,该方法本质上指示数组对象如何在+符号下交互。当然,这里还有很大的改进空间,并检查例外情况,但这只是为了强调一个事实,即你可以定义你想要的任何东西。您可以看到,添加两个数组对象会返回一个新的数组对象,这使我们可以继续添加。

只是为了让你看看它是如何工作的,下面我写了一个非常简单的例子:

A = array([1,2,3,4,5])
B = array([3,2,4,5,6])
C = A+B

然后,如果你在提示中键入C,你会看到

[4, 4, 7, 9, 11]

它又是一个数组类。

如果你能用两行生存下来,试试这个:

for item in L:
    item.r += item.v + 0.5 * item.a

最新更新