我有一个数据结构,它是这样的元组的集合:

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']
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top