Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于包含的值从元组集合中检索元组_Python_Tuples - Fatal编程技术网

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

Python 基于包含的值从元组集合中检索元组,python,tuples,Python,Tuples,我有一个数据结构,它是元组的集合,如下所示: things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") ) 第一个和第三个元素都是该系列独有的 我想做的是通过引用第三个值来检索特定的元组,例如: >>> my_thing = things.get( value(3) == "Blurgle" ) (154, 33, "Blurgle") 一定有比写一个循环来逐个检查每个值更好的方法 如果

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

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )
第一个和第三个元素都是该系列独有的

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

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

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

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

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

虽然在引擎盖下,我假设它会遍历所有的值并单独检查它们。如果您不喜欢,那么如何更改
my_things
结构,使其成为
dict
,并使用第一个或第三个值作为键?

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

>> my_thing = [x for x in things if x[2]=="Blurgle"][0]
虽然在引擎盖下,我假设它会遍历所有的值并单独检查它们。如果您不喜欢这样,那么如何更改
my_things
结构,使其成为
dict
,并使用第一个或第三个值作为键?

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

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

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

它通顺地读作“其子项相等模糊的事物中的下一项”(当你从头开始时,你发现的“下一项”将是“第一项”——在你的情况下,是唯一合适的一项)

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

循环(或类似于列表理解或genexp的100%等价物)如果您的外部层次结构是元组,那么它实际上是唯一的方法,正如您所指出的——元组经过精心设计,是一个非常轻量级的容器,实际上几乎没有任何方法(只有实现索引、循环等所需的少数特殊方法;-)

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

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

它通顺地读作“其子项相等模糊的事物中的下一项”(当你从头开始时,你发现的“下一项”将是“第一项”——在你的情况下,是唯一合适的一项)


如果需要讨论没有项满足谓词的情况,可以传递第二个参数(如果需要,它将返回该参数),否则(没有第二个参数,如我的代码片段中所示),如果没有项满足谓词,您将得到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 = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

things_dict = {}
for t in things:
    things_dict[t[2]] = t

print things_dict['Blarg']

我更感兴趣的是清楚地表达意图,而不是快速获得结果。使用Python的循环理解将循环减少为一行代码,这(如C和Perl中的三元“?”)以维护程序员的挫败感为代价实现了代码的简洁性:)从基于一个参数快速检索信息的角度来看,字典的想法是明智的。谢谢你的想法。我已经更新了我的代码来解决这个问题。如果我正在接受培训的人不能像我一样费心学习Python,这不是我的问题。#被动渐进,然后回来几年后,对生成器的理解现在确实看起来更具可读性了。但我拥有一两年Python的优势,不再被导致我之前评论的沮丧和愤怒所蒙蔽:)谢谢你的清晰解释!我更感兴趣的是清楚地表达意图,而不是迅速得到结果。使用Python的循环理解将循环减少为一行代码,这(如C和Perl中的三元“?”)实现了代码的简洁性,但代价是维护程序员的挫败感:)从快速检索的角度来看,字典的想法是合理的