从条件列表中选择值

时间:2011-10-24 13:22:52

标签: python tuples

我有一个元组列表。每个元组都有5个元素(对应5个数据库列) 我想提出一个问题

select attribute1 from mylist where attribute2 = something

e.g。

personAge = select age from mylist where person_id = 10

是否可以以某种方式查询元组列表?

谢谢

4 个答案:

答案 0 :(得分:60)

如果你有named tuples,你可以这样做:

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

否则使用索引:

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

或者按照Nate的回答使用元组解包。请注意,您不必为解压缩的每个项目指定有意义的名称。您可以(person_id, age, _, _, _, _)解包六项元组。

答案 1 :(得分:13)

对此的一个解决方案是列表理解,在元组内部使用模式匹配:

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

另一种方法是使用mapfilter

>>> map( lambda (age,_): age, filter( lambda (_,person_id): person_id == 10, mylist) )
[55]

答案 2 :(得分:7)

是的,如果您知道所需列位于元组中的哪个位置,则可以使用过滤器。如果情况是id是元组的第一个元素,那么你可以像这样过滤列表:

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

这将返回相应元组的列表。如果你想要年龄,只需选择你想要的元素。您也可以使用列表理解并在第一步中选择元素,而不是过滤器。您甚至可以立即打开包装(如果只有一个结果):

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

但我强烈建议您为此目的使用dictionariesnamed tuples

答案 3 :(得分:1)

基于 Nate 的回答:如果您的列表包含具有非唯一值的元组,这可能会产生一个布尔值 ValueError(一个系列的真值不明确)。为了规避:

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

显然,对于“person_id”来说,这不太直观,但假设您切换查询:查找给定年龄的人的所有 person_ID。