Выберите значение из списка кортежей, где условие - PullRequest
33 голосов
/ 24 октября 2011

У меня есть список кортежей. Каждый кортеж имеет 5 элементов (соответствует 5 столбцам базы данных) и я хотел бы сделать запрос

select attribute1 from mylist where attribute2 = something

, например

personAge = select age from mylist where person_id = 10

Можно ли как-то запросить список кортежей?

спасибо

Ответы [ 3 ]

61 голосов
/ 24 октября 2011

Если у вас есть именованные кортежи , вы можете сделать это:

results = [t.age for t in mylist if t.person_id == 10]

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

results = [t[1] for t in mylist if t[0] == 10]

Или используйте распаковку кортежей в соответствии с ответом Нейта.Обратите внимание, что вам не нужно давать значимое имя каждому распакованному предмету.Вы можете (person_id, age, _, _, _, _) распаковать кортеж из шести предметов.

14 голосов
/ 24 октября 2011

Одним из решений этой проблемы было бы понимание списка с сопоставлением шаблонов внутри вашего кортежа:

>>> mylist = [(25,7),(26,9),(55,10)]
>>> [age for (age,person_id) in mylist if person_id == 10]
[55]

Другим способом было бы использование map и filter:

>>> map( lambda (age,_): age, filter( lambda (_,person_id): person_id == 10, mylist) )
[55]
8 голосов
/ 24 октября 2011

Да, вы можете использовать фильтр, если вы знаете, в какой позиции в кортеже находится нужный столбец.Если дело в том, что id является первым элементом кортежа, то вы можете отфильтровать список следующим образом:

filter(lambda t: t[0]==10, mylist)

Это вернет список соответствующих кортежей.Если вы хотите возраст, просто выберите элемент, который вы хотите.Вместо фильтра вы также можете использовать списки и выбрать элемент с первого раза.Вы можете даже сразу распаковать его (если есть только один результат):

[age] = [t[1] for t in mylist if t[0]==10]

Но я бы настоятельно рекомендовал использовать словари или именованные кортежи цель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...