У меня был код, содержащий zip(*G)[0]
(и в другом месте zip(*G)[1]
, с другим G). G
- список кортежей. То, что это делает, возвращает список первого (или вообще, для zip(*G)[n]
, n-1
th) элемента каждого кортежа в G как кортеж. Например,
>>> G = [(1, 2, 3), ('a', 'b', 'c'), ('you', 'and', 'me')]
>>> zip(*G)[0]
(1, 'a', 'you')
>>> zip(*G)[1]
(2, 'b', 'and')
Это довольно умно и все, но проблема в том, что он не работает в Python 3, потому что zip
- это итератор. Кроме того, 2to3 недостаточно умен, чтобы его исправить. Поэтому очевидным решением является использование list(zip(*G))[0]
, но это заставило меня задуматься: возможно, это более эффективный способ сделать это. Нет необходимости создавать все кортежи, созданные zip. Мне просто нужен n
-й элемент каждого набора в G.
Есть ли более эффективный, но одинаково компактный способ сделать это? У меня все в порядке со стандартной библиотекой. В моем случае использования каждый кортеж в G будет иметь длину не менее n
, поэтому нет необходимости беспокоиться о случае остановки zip на кортежей с наименьшей длиной (т.е. Всегда будет определен zip(*G)[n]
).
Если нет, я думаю, что я просто придерживаюсь упаковки zip
в list()
.
(P.S., я знаю, что это ненужная оптимизация. Мне просто интересно)
UPDATE:
Если кто-то заботится, я пошел с опцией t0, t1, t2 = zip(*G)
. Во-первых, это позволяет мне давать значимые имена данным. Мой G
фактически состоит из 2 кортежей (представляющих числители и знаменатели). Понимание списка было бы чуть более читаемым, чем zip, но этот способ намного лучше (и поскольку в большинстве случаев zip был списком, который я повторял в понимании списка, это делает вещи более плоскими).
Во-вторых, как замечают @thewolf и @Sven Marnach отличные ответы, этот способ быстрее для небольших списков. В большинстве случаев мой G на самом деле невелик (и если он большой, то это определенно не будет узким местом кода!).
Но было больше способов сделать это, чем я ожидал, включая новую функцию a, *b, c = G
для Python 3, о которой я даже не знал.