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