基于包含的值从元组集合中检索元组

2024-10-03 23:22:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据结构,它是元组的集合,如下所示:

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

第一个和第三个元素对集合来说都是唯一的。在

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

^{pr2}$

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


Tags: 方法元素数据结构元组thingspr2blargblurgle
3条回答

如果外部层次结构是元组,那么循环(或者像list comprehension或genexp之类的100%等效的东西)才是真正的唯一方法,正如您所指出的那样,元组是一个非常轻量级的容器,实际上几乎没有任何方法(只是实现索引所需的一些特殊方法,循环等;-)。在

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

如果你选择循环,根据Brian的评论和我的回复,genexp的可读性和平均速度可能是listcomp的两倍(因为它只完成了循环的一半):

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

它读起来很流畅,就是“下一个项目中的第[2]子项等式模糊”(当你从头开始时,你找到的“下一个”项目将是“第一个”,在你的情况下,只有一个合适的项目)。在

如果需要覆盖没有项满足谓词的情况,则可以传递next第二个参数(如果需要,它将返回该参数),否则(没有第二个参数,如我的代码片段中所示),如果没有项满足谓词,则会出现StopIteration异常两种行为都可能是您想要的(正如您所说的,这种情况永远不会出现,异常看起来适合于您的特定应用程序,因为所讨论的事件将是一个意外错误)。在

如果你必须多次进行这种类型的搜索,为什么不一次性地将事物转换为不确定的事物,那么以后搜索起来会更容易、更快

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']

如果things是一个列表,并且您知道第三个元素是uniqe,那么列表理解呢?在

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

尽管在引擎盖下,我假设它会遍历所有的值并逐个检查它们。如果您不喜欢这样,那么将my_things结构改为dict并使用第一个或第三个值作为键呢?在

相关问题 更多 >