【发布时间】:2011-12-14 03:29:55
【问题描述】:
我有一个元组列表。每个元组有 5 个元素(对应 5 个数据库列),我想做一个查询
select attribute1 from mylist where attribute2 = something
例如
personAge = select age from mylist where person_id = 10
是否可以通过某种方式查询元组列表?
【问题讨论】:
我有一个元组列表。每个元组有 5 个元素(对应 5 个数据库列),我想做一个查询
select attribute1 from mylist where attribute2 = something
例如
personAge = select age from mylist where person_id = 10
是否可以通过某种方式查询元组列表?
【问题讨论】:
如果你有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, _, _, _, _) 来解压缩一个六项元组。
【讨论】:
对此的一种解决方案是列表推导,在您的元组中进行模式匹配:
>>> 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]
【讨论】:
是的,如果您知道所需列位于元组中的哪个位置,则可以使用过滤器。如果情况是 id 是元组的第一个元素,那么您可以像这样过滤列表:
filter(lambda t: t[0]==10, mylist)
这将返回相应元组的列表。如果您想要年龄,只需选择您想要的元素。除了过滤器,您还可以使用列表理解并在第一时间选择元素。您甚至可以立即解压(如果只有一个结果):
[age] = [t[1] for t in mylist if t[0]==10]
但我强烈建议为此使用dictionaries 或named tuples。
【讨论】:
[(1,'name', 20, 'bar'),(2,'name2', 33, 'foo'), ...],如果我想使用它,我会将每个元组映射到字典中,例如:[{'id': 1, 'name': 'name', 'age': 20, 'etc': 'bar'}, ..]。查询它会变得更具可读性。如果我只通过 id 进行查询,我什至可以将它用作字典键(所以它会是字典的字典)。
select where person_id > 5 and person_id < 15 或类似的东西,字典就无法执行这种搜索;另外,如果他想按年龄选择呢?在这两种情况下,您都必须执行某种字典理解。
[t for t in data where t['id'] > 5 and t['id'] < 15] 一样简单。您可以通过这种方式选择基本上任何东西(只要它只需要一条线进入透视图)。
基于 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。
【讨论】: