Create list of object attributes in python

前端 未结 4 1485
长情又很酷
长情又很酷 2021-01-11 12:26

I have a list of objects:

[Object_1, Object_2, Object_3]

Each object has an attribute: time:

Object_1.time = 20
Object_2.ti         


        
相关标签:
4条回答
  • 2021-01-11 12:39

    List comprehension is what you're after:

    list_of_objects = [Object_1, Object_2, Object_3]
    [x.time for x in list_of_objects]
    
    0 讨论(0)
  • 2021-01-11 12:40

    The fastest (and easiest to understand) is with a list comprehension.

    See the timing:

    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'
    

    Prints:

    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
    

    So list comprehension is both faster to write and faster to execute.

    0 讨论(0)
  • 2021-01-11 12:42
    from operator import attrgetter
    items = map(attrgetter('time'), objects)
    
    0 讨论(0)
  • 2021-01-11 12:53

    How about:

    items=[item.time for item in objects]
    
    0 讨论(0)
提交回复
热议问题