题
我有一个数据结构,它是这样的元组的集合:
things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )
在第一和第三元件的每个唯一到集合中。
我想要做的就是通过参考第三值检索特定的元组是什么,例如:
>>> my_thing = things.get( value(3) == "Blurgle" )
(154, 33, "Blurgle")
必须有一个更好的方式比写一个循环接一个地检查每个值一个!
解决方案
如果things
是一个列表,你知道,第三个元素是潮头,何谈列表理解?
>> my_thing = [x for x in things if x[2]=="Blurgle"][0]
虽然在引擎盖下,我假定经过的所有值和单独地检查它们。如果你不喜欢,怎么样改变my_things
结构,这是一个dict
和使用第一或第三值作为重点?
其他提示
一个循环(或等同的东西就像一个列表理解或genexp 100%)真的是唯一的方法,如果你的外在层次结构是一个元组,你表示 - 元组,通过深思熟虑的设计,极轻的重量的容器中,实际上几乎没有任何的方法。(只是为了实现索引所需的几个特殊方法,循环等; - )
闪电快速检索是字典,不元组的特性。你能不能有一个字典(为主要结构,或作为侧辅助之一)映射到你所寻求的子元组“第三个元素的值”(或主元组指标,也许)?这可能与一个循环建立,然后根据你在乎曾经拥有提供尽可能多的快速搜索!
如果您选择循环,一个genexp按照Brian的评论的我的回答是这两个更具可读性,平均也许快两倍,比listcomp(因为它只做一半的循环):
my_thing = next(item for item in things if item[2] == "Blurgle")
其顺利读作“的事情,其[2]分项equale Blurgle下一个项目”(当您从头开始“下一步”项目你会发现将是“第一” - 而且,在你的情况下,仅 - 。合适的一个)
如果您需要支付在没有项目满足谓词的情况下,你可以通过next
第二个参数(其在需要时将返回),否则(没有第二个参数,在我的代码段),你会得到如果项目不符合谓词StopIteration异常 - 无论是行为可能是您所希望的(就像你说的情况不应该发生,异常寻找适合您的特定应用,因为问题的发生将是一个意外的错误)<。 / p>
如果您需要做这种类型的搜索多次的,你为什么不转换的东西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']