我有一个数据结构,它是这样的元组集合:
things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )
第一个和第三个元素对于集合都是唯一的。
我想要做的是通过引用第三个值来检索特定元组,例如:
>>> my_thing = things.get( value(3) == "Blurgle" )
(154, 33, "Blurgle")
必须有一种比编写循环更好的方法来逐一检查每个值!
答案 0 :(得分:4)
如果你的外层结构是一个元组,如你所指出的那样,一个循环(或类似于列表理解或genexp的100%等效的东西)真的是唯一的方法 - 元组通过精心设计,非常轻量级容器,实际上几乎没有任何方法(只需要实现索引,循环等所需的几个特殊方法;)。
快速检索是词典的一个特征,而不是元组。难道你不能有一个字典(作为主要结构,或作为一个辅助的一个)将“第三元素的值”映射到你寻找的子集(或者它在主元组中的索引,也许)?这可以通过一个循环构建,然后提供尽可能多的快速搜索!
如果您选择循环,根据Brian的评论编写一个genexp,我对它的回复更具可读性,平均速度可能是listcomp的两倍(因为它只有一半循环):
my_thing = next(item for item in things if item[2] == "Blurgle")
顺畅地读作“[2]子项目等于Blurgle的事物的下一个项目”(因为你从头开始,你找到的“下一个”项目将是“第一个” - 并且,你的情况,只有 - 合适的一个。)
如果你需要覆盖没有项目符合谓词的情况,你可以传递next
第二个参数(如果需要它将返回),否则(没有第二个参数,如我的代码片段)如果没有项目符合谓词,你将获得一个StopIteration异常 - 任何一种行为都可能是你想要的(正如你所说的那样,永远不会出现这种情况,一个异常看起来适合你的特定应用,因为这个问题会出乎意料)误差)。
答案 1 :(得分:1)
如果things
是一个列表,并且您知道第三个元素是唯一的,那么列表理解呢?
>> my_thing = [x for x in things if x[2]=="Blurgle"][0]
虽然在幕后,但我认为它会遍历所有值并单独检查它们。如果您不喜欢这样,那么更改my_things
结构以使其为dict
并使用第一个或第三个值作为关键字呢?
答案 2 :(得分:1)
如果你不得不多次进行这种类型的搜索,为什么不把东西转换成things_dict一次,那么以后搜索就会轻松快捷
things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )
things_dict = {}
for t in things:
things_dict[t[2]] = t
print things_dict['Blarg']