我有一个对象列表:
[Object_1, Object_2, Object_3]
每个对象都有一个属性:时间:
Object_1.time = 20
Object_2.time = 30
Object_3.time = 40
我想创建一个时间属性列表:
[20, 30, 40]
获得此输出的最有效方法是什么?不可能遍历对象列表,对吗?:
items = []
for item in objects:
items.append(item.time)
我有一个对象列表:
[Object_1, Object_2, Object_3]
每个对象都有一个属性:时间:
Object_1.time = 20
Object_2.time = 30
Object_3.time = 40
我想创建一个时间属性列表:
[20, 30, 40]
获得此输出的最有效方法是什么?不可能遍历对象列表,对吗?:
items = []
for item in objects:
items.append(item.time)
列表理解是您所追求的:
list_of_objects = [Object_1, Object_2, Object_3]
[x.time for x in list_of_objects]
from operator import attrgetter
items = map(attrgetter('time'), objects)
最快(也是最容易理解)的是列表理解。
看时间:
import timeit
import random
c=10000
class SomeObj:
def __init__(self, i):
self.attr=i
def loopCR():
l=[]
for i in range(c):
l.append(SomeObj(random.random()))
return l
def compCR():
return [SomeObj(random.random()) for i in range(c)]
def loopAc():
lAttr=[]
for e in l:
lAttr.append(e.attr)
return lAttr
def compAc():
return [e.attr for e in l]
t1=timeit.Timer(loopCR).timeit(10)
t2=timeit.Timer(compCR).timeit(10)
print "loop create:", t1,"secs"
print "comprehension create:", t2,"secs"
print 'Faster of those is', 100.0*abs(t1-t2) / max(t1,t2), '% faster'
print
l=compCR()
t1=timeit.Timer(loopAc).timeit(10)
t2=timeit.Timer(compAc).timeit(10)
print "loop access:", t1,"secs"
print "comprehension access:", t2,"secs"
print 'Faster of those is', 100.0*abs(t1-t2) / max(t1,t2), '% faster'
印刷:
loop create: 0.103852987289 secs
comprehension create: 0.0848100185394 secs
Faster of those is 18.3364670069 % faster
loop access: 0.0206878185272 secs
comprehension access: 0.00913000106812 secs
Faster of those is 55.8677438315 % faster
所以列表推导式写起来更快,执行起来也更快。
怎么样:
items=[item.time for item in objects]