我有一个元组列表。每个元组都有5个元素(对应5个数据库列) 我想提出一个问题
select attribute1 from mylist where attribute2 = something
e.g。
personAge = select age from mylist where person_id = 10
是否可以以某种方式查询元组列表?
谢谢
答案 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]
另一种方法是使用map
和filter
:
>>> 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]
但我强烈建议您为此目的使用dictionaries或named 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。