zip(*G)[0]
私は(そして他の場所でzip(*G)[1]
は、異なるGで) を含むいくつかのコードを持っていました。G
タプルのリストです。これは、Gの各タプルの最初の(または一般的にzip(*G)[n]
はth番目の)要素のリストをタプルとして返すことです。n-1
例えば、
>>> G = [(1, 2, 3), ('a', 'b', 'c'), ('you', 'and', 'me')]
>>> zip(*G)[0]
(1, 'a', 'you')
>>> zip(*G)[1]
(2, 'b', 'and')
zip
これはかなり賢い方法ですが、問題はPython3ではイテレータであるため機能しないことです。さらに、2to3はそれを修正するほど賢くはありません。したがって、明らかな解決策はを使用することlist(zip(*G))[0]
ですが、それは私に考えさせられました:おそらくこれを行うためのより効率的な方法があります。zipが作成するすべてのタプルを作成する必要はありません。n
Gの各タプル のth要素が必要です。
これを行うためのより効率的ですが、同様にコンパクトな方法はありますか?標準ライブラリの何でも大丈夫です。私のユースケースでは、Gの各タプルは少なくとも長さn
になるため、zipが最小の長さのタプルで停止する場合を心配する必要はありません(つまり、zip(*G)[n]
常に定義されます)。
zip
そうでない場合は、でラップすることに固執すると思いますlist()
。
(PS、私はこれが不必要な最適化であることを知っています。私はただ興味がありますすべてです)
アップデート:
誰かが気にする場合に備えて、私はt0, t1, t2 = zip(*G)
オプションで行きました。まず、これにより、データに意味のある名前を付けることができます。私G
は実際には長さ2のタプル(分子と分母を表す)で構成されています。リスト内包表記はzipよりもわずかに読みやすくなりますが、この方法の方がはるかに優れています(ほとんどの場合、zipはリスト内包表記で繰り返し処理したリストであるため、これにより物事がフラットになります)。
第二に、@thewolfと@SvenMarnachの優れた回答で指摘されているように、この方法はリストが小さいほど高速です。私のGは実際にはほとんどの場合大きくありません(そしてそれが大きい場合、これは間違いなくコードのボトルネックにはなりません!)。
a, *b, c = G
しかし、これを行うには、私が知らなかったPython 3の新機能など、予想以上に多くの方法がありました。