Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
List Python:通过元组列表进行搜索_List_Search_Python 3.x_Tuples - Fatal编程技术网

List Python:通过元组列表进行搜索

List Python:通过元组列表进行搜索,list,search,python-3.x,tuples,List,Search,Python 3.x,Tuples,我有一个元组列表,例如 >>> l = [ ("a",1), ("b",2), ("c",3) ] 我可以假设元素是唯一的。现在我想得到元组的第一个元素,它的第二个元素是2(在本例中是'b')。第一次尝试是: >>> [ x for x, y in l if y == 2 ][0] 'b' 考虑到创建第二个列表只是为了索引第0个元素,这似乎有点麻烦。另一种方法是反转给定列表中的所有元组l,并构建一个字典,然后索引该字典: >>> dict

我有一个元组列表,例如

>>> l = [ ("a",1), ("b",2), ("c",3) ]
我可以假设元素是唯一的。现在我想得到元组的第一个元素,它的第二个元素是
2
(在本例中是
'b'
)。第一次尝试是:

>>> [ x for x, y in l if y == 2 ][0]
'b'
考虑到创建第二个列表只是为了索引第0个元素,这似乎有点麻烦。另一种方法是反转给定列表中的所有元组
l
,并构建一个字典,然后索引该字典:

>>> dict([ (y, x) for x, y in l ])[2]
'b'
考虑到颠倒列表和创建字典所涉及的数据混乱量,这似乎更为尴尬。最后,最详细但可能最快的方法是简单地迭代列表:

>>> def get(l) :
...     for x, y in l :
...         if y == 2 : 
...             return x
...     assert not "Should not happen."
... 
>>> get(l)
'b'
我的问题是:有没有更好、更具python风格的方法来搜索此列表?

您也可以使用:

请注意,如果未找到任何内容,它将抛出
StopIteration
异常,除非提供了
default

In [3]: next(a for a, b in l if b == 100)
---------------------------------------------------------------------------
StopIteration                             
Traceback (most recent call last)
<ipython-input-38-14fe91d87aab> in <module>()
----> 1 next(a for a, b in l if b == 100)

StopIteration: 

In [4]: next((a for a, b in l if b == 100), 0)
Out[4]: 0
[3]中的
:下一步(a代表a,如果b==100,则b在l中)
---------------------------------------------------------------------------
停止迭代
回溯(最近一次呼叫最后一次)
在()
---->1下一步(a代表a,如果b=100,则b在l中)
停止迭代:
在[4]中:下一个((a代表a,b代表l,如果b=100),0)
Out[4]:0
试试这个:

next(x for x in l if x[1] == 2)[0]

使用
next()
的优点是,我们只迭代查找我们要查找的内容所需的最少元素,因此不,这并不等同于使用列表理解创建一个全新的列表,然后返回第一个元素。

这取决于如何付款、空间或时间。你不可能两者兼得

1如果我们想加快速度:

l = [ ("a",1), ("b",2), ("c",3) ]
_dict = {k:v for v,k in l}
print(_dict.get(2, None))

2如果篇幅有限,请尝试另一个答案的下一个或你的循环。

这是第一个列表理解的
[0]
索引的同义词,因此与我得到的没有太大区别?@Jens Oscar刚刚提供了解释,请查看。我想你应该接受他的回答。哦。。。因此,这与上一次尝试更为一致,即
get()
函数,该函数也以找到的元素停止。@Jens是的,它们是等价的。不要遵循1:要构建字典,需要在列表上进行完整的迭代,然后进行字典查找。此外,使用
get()
方法是最昂贵的字典查找(请参阅)。那么-使用
next()
,1如何加快速度?链接主题中速度较慢的原因是数据太小,而代价是函数调用。但是,如果数据或元组是百万或更大的,哈希映射或集合的特性将像O(1)一样加速,而不像其他方法O(n)(例如,如果x[1]==2[0]),如果您使用查找而不是构造来稳定,则next(x代表l中的x)[0])。不幸的是,在我的例子中,我需要迭代不断变化的元组列表。
l = [ ("a",1), ("b",2), ("c",3) ]
_dict = {k:v for v,k in l}
print(_dict.get(2, None))