Python распаковывает список кортежей

Я использую python/django, и у меня есть кортеж кортежей (или список кортежей. Не имеет большого значения), в основном это результат SQL-запроса. Я печатаю так:

Если бы у меня был

output= [(a1,b1,c1,d1), (a2,b2,c2,d2), ...] 

So I'll do:

for a,b,c,d in output:
  ...

теперь дело в том, что иногда я выбираю много столбцов и не хочу печатать их все. Могу ли я распаковать только те значения, которые мне нужны. или я ограничен из-за порядка кортежей?
т.е. могу ли я сделать, например:

for a, d in output:
   ...

(обратите внимание, я хочу пропустить второе и третье значение в кортежах) Возможно ли это или мне нужно использовать пользовательские индексы?

Очевидно, что в шаблоне django он немного отличается, но суть та же.


person user3599803    schedule 05.06.2014    source источник


Ответы (3)


Вам все равно нужно распаковать их, но вы можете их игнорировать:

for a, _, _, d in output:
    # Do things with a and d

Если вы используете Python 3, вы также можете использовать *:

for a, *_, d in output:
    # same deal - _ is now a list of all the values between `0 and len(row) - 1`

Преимущество Python 3 заключается в том, что длина отдельной строки может измениться (до 2 элементов), и вы все равно получите правильные значения, тогда как в Python 2 строка разорвется, если строка вывода отличается от 4 записей. .

person Sean Vieira    schedule 05.06.2014
comment
Достаточно хорошо. есть ли разница в эффективности? Я имею в виду, что эффективнее не распаковывать все значения? - person user3599803; 05.06.2014

Вы не можете выборочно распаковать из кортежа. Обычный способ указать, что вы не будете использовать определенные значения в Python, — использовать символ подчеркивания _:

for a, _, _, d in output:
    ...

В качестве альтернативы используйте индексы:

for t in output:
    a, b = t[0], t[-1]
    ...
person jonrsharpe    schedule 05.06.2014

Это не обязательно рекомендуемый способ, но я думаю, что есть смысл продемонстрировать, насколько мощной является причудливая нарезка numpy:

import numpy as np
output = np.array(output, dtype='object')
for a,d in output[:, [0,3]]:
   print('a=%s, d=%s' % (a, d))
person shx2    schedule 05.06.2014