0

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

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

第一个和第三个元素对于该集合都是唯一的。

我想要做的是通过引用第三个值来检索特定的元组,例如:

>>> my_thing = things.get( value(3) == "Blurgle" )
(154, 33, "Blurgle")

一定有比编写循环更好的方法来逐个检查每个值!

4

3 回答 3

4

如果您的外层结构是元组,则循环(或 100% 等效的东西,如列表理解或 genexp)确实是唯一的方法,正如您所指出的 - 元组是经过深思熟虑的设计,是一个非常轻量级的容器,具有实际上几乎没有任何方法(只是实现索引、循环等所需的少数特殊方法;-)。

快速检索是字典而不是元组的特征。你不能有一个字典(作为主要结构,或作为辅助结构)将“第三个元素的值”映射到你寻找的子元组(或者它在主元组中的索引,也许)?这可以用一个循环构建,然后提供尽可能多的快速搜索!

如果您选择循环,根据 Brian 的评论和我对它的回复,genexp 的可读性更高,并且平均速度可能是 listcomp 的两倍(因为它只执行了一半的循环):

my_thing = next(item for item in things if item[2] == "Blurgle")

它读作“[2] 子项等于 Blurgle 的事物中的下一个项目”(当您从头开始时,您找到的“下一个”项目将是“第一个”——而且,在你的情况下,只有——合适的一个)。

如果您需要涵盖没有项目符合谓词的情况,您可以传递next第二个参数(如果需要,它将返回),否则(没有第二个参数,如我的片段中所示)您将得到一个 StopIteration 异常如果没有项目符合谓词 - 任何一种行为都可能是您想要的(正如您所说的情况永远不会出现,异常看起来适合您的特定应用程序,因为有问题的发生将是意外错误)。

于 2009-06-26T05:04:52.893 回答
1

如果things是一个列表,并且您知道第三个元素是唯一的,那么列表推导式呢?

>> my_thing = [x for x in things if x[2]=="Blurgle"][0]

尽管在幕后,我假设它会遍历所有值并单独检查它们。如果您不喜欢这样,那么将my_things结构更改为 adict并使用第一个或第三个值作为键呢?

于 2009-06-26T04:54:31.410 回答
1

如果你必须多次进行这种类型的搜索,为什么不将 things 转换为 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']
于 2009-06-26T05:58:35.210 回答