42
如何使用列表理解從列表中構建2元組的元組。這將相當於使用列表理解構建元組
tup =()
for element in alist:
tup = tup + ((element.foo, element.bar),)
如何使用列表理解從列表中構建2元組的元組。這將相當於使用列表理解構建元組
tup =()
for element in alist:
tup = tup + ((element.foo, element.bar),)
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
(+ 1)值得指出的是,從技術上講,這不是一個列表理解(但我相信OP不會介意:)) – NPE 2013-03-14 13:07:43
you coul d也做'tuple(map(operator.attrgetter('foo','bar'),alist))'。我可能會使用您發佈的內容來提高可讀性,但「attrgetter」可能會略有性能優勢。你不得不「時間」,看看這是否是一個真正的緊密循環。 – mgilson 2013-03-14 13:11:44
這個例子中的列表理解和生成器表達式有什麼區別,因爲它調用了tuple()?不管形式如何,它都不會消耗相同的內存空間? – Octipi 2013-03-14 13:14:12