81

リスト内包表記を使用して、リストから 2 タプルのタプルを作成するにはどうすればよいですか。それは

tup = ()
for element in alist:
    tup = tup + ((element.foo, element.bar),)
4

2 に答える 2

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

技術的には、これはジェネレータ式です。これはリスト内包表記に似ていますが、遅延評価され、中間リストにメモリを割り当てる必要はありません。

完全を期すために、リスト内包表記は次のようになります。

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

 

PS:attrgetter高速ではありません (alistここには 100 万個のアイテムがあります):

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
于 2013-03-14T13:06:49.380 に答える