2024-10-03 23:22:02 发布
网友
我有一个数据结构,它是元组的集合,如下所示:
things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )
第一个和第三个元素对集合来说都是唯一的。在
我要做的是通过引用第三个值来检索特定的元组,例如:
一定有比写循环更好的方法来逐个检查每个值!在
如果外部层次结构是元组,那么循环(或者像list comprehension或genexp之类的100%等效的东西)才是真正的唯一方法,正如您所指出的那样,元组是一个非常轻量级的容器,实际上几乎没有任何方法(只是实现索引所需的一些特殊方法,循环等;-)。在
闪电般快速的检索是字典的特点,而不是元组。你不能有一个字典(作为主结构,或者作为辅助结构)把“第三元素的值”映射到你所寻找的子元组(或者它在主元组中的索引)的映射吗?它可以用一个循环构建,然后提供尽可能多的快速搜索!在
如果你选择循环,根据Brian的评论和我的回复,genexp的可读性和平均速度可能是listcomp的两倍(因为它只完成了循环的一半):
my_thing = next(item for item in things if item[2] == "Blurgle")
它读起来很流畅,就是“下一个项目中的第[2]子项等式模糊”(当你从头开始时,你找到的“下一个”项目将是“第一个”,在你的情况下,只有一个合适的项目)。在
如果需要覆盖没有项满足谓词的情况,则可以传递next第二个参数(如果需要,它将返回该参数),否则(没有第二个参数,如我的代码片段中所示),如果没有项满足谓词,则会出现StopIteration异常两种行为都可能是您想要的(正如您所说的,这种情况永远不会出现,异常看起来适合于您的特定应用程序,因为所讨论的事件将是一个意外错误)。在
next
如果你必须多次进行这种类型的搜索,为什么不一次性地将事物转换为不确定的事物,那么以后搜索起来会更容易、更快
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,那么列表理解呢?在
things
>> my_thing = [x for x in things if x[2]=="Blurgle"][0]
尽管在引擎盖下,我假设它会遍历所有的值并逐个检查它们。如果您不喜欢这样,那么将my_things结构改为dict并使用第一个或第三个值作为键呢?在
my_things
dict
如果外部层次结构是元组,那么循环(或者像list comprehension或genexp之类的100%等效的东西)才是真正的唯一方法,正如您所指出的那样,元组是一个非常轻量级的容器,实际上几乎没有任何方法(只是实现索引所需的一些特殊方法,循环等;-)。在
闪电般快速的检索是字典的特点,而不是元组。你不能有一个字典(作为主结构,或者作为辅助结构)把“第三元素的值”映射到你所寻找的子元组(或者它在主元组中的索引)的映射吗?它可以用一个循环构建,然后提供尽可能多的快速搜索!在
如果你选择循环,根据Brian的评论和我的回复,genexp的可读性和平均速度可能是listcomp的两倍(因为它只完成了循环的一半):
它读起来很流畅,就是“下一个项目中的第[2]子项等式模糊”(当你从头开始时,你找到的“下一个”项目将是“第一个”,在你的情况下,只有一个合适的项目)。在
如果需要覆盖没有项满足谓词的情况,则可以传递
next
第二个参数(如果需要,它将返回该参数),否则(没有第二个参数,如我的代码片段中所示),如果没有项满足谓词,则会出现StopIteration异常两种行为都可能是您想要的(正如您所说的,这种情况永远不会出现,异常看起来适合于您的特定应用程序,因为所讨论的事件将是一个意外错误)。在如果你必须多次进行这种类型的搜索,为什么不一次性地将事物转换为不确定的事物,那么以后搜索起来会更容易、更快
如果
things
是一个列表,并且您知道第三个元素是uniqe,那么列表理解呢?在尽管在引擎盖下,我假设它会遍历所有的值并逐个检查它们。如果您不喜欢这样,那么将
my_things
结构改为dict
并使用第一个或第三个值作为键呢?在相关问题 更多 >
编程相关推荐