1. ホーム
  2. python

[解決済み] リスト内包を利用してタプルを構築する

2023-07-02 16:35:47

質問

リスト内包を使って、リストから2-タプルのタプルを作るにはどうしたらよいでしょうか。それは次のように等価である

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

どのように解決するのですか?

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