2013-03-14 81 views

回答

60
tup = tuple((element.foo, element.bar) for element in alist) 

從技術上講,這是一個generator expression。它就像一個列表理解,但它是懶惰評估的,不需要爲中間列表分配內存。

爲了完整起見,列表理解是這樣的:

tup = tuple([(element.foo, element.bar) for element in alist]) 

 

PS:attrgetter是不是更快(alist在這裏有一萬件):

In [37]: %timeit tuple([(element.foo, element.bar) for element in alist]) 
1 loops, best of 3: 165 ms per loop 

In [38]: %timeit tuple((element.foo, element.bar) for element in alist) 
10 loops, best of 3: 155 ms per loop 

In [39]: %timeit tuple(map(operator.attrgetter('foo','bar'), alist)) 
1 loops, best of 3: 283 ms per loop 

In [40]: getter = operator.attrgetter('foo','bar') 

In [41]: %timeit tuple(map(getter, alist)) 
1 loops, best of 3: 284 ms per loop 

In [46]: %timeit tuple(imap(getter, alist)) 
1 loops, best of 3: 264 ms per loop 
+0

(+ 1)值得指出的是,從技術上講,這不是一個列表理解(但我相信OP不會介意:)) – NPE 2013-03-14 13:07:43

+2

you coul d也做'tuple(map(operator.attrgetter('foo','bar'),alist))'。我可能會使用您發佈的內容來提高可讀性,但「attrgetter」可能會略有性能優勢。你不得不「時間」,看看這是否是一個真正的緊密循環。 – mgilson 2013-03-14 13:11:44

+1

這個例子中的列表理解和生成器表達式有什麼區別,因爲它調用了tuple()?不管形式如何,它都不會消耗相同的內存空間? – Octipi 2013-03-14 13:14:12