Python:搜索元组列表

时间:2015-04-03 02:31:13

标签: 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([ (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'

我的问题是:有没有更好,更pythonic的方法来搜索这个列表?

3 个答案:

答案 0 :(得分:7)

试试这个:

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

使用next()的优点是我们只迭代查找我们正在寻找的内容所需的最少量元素,所以不,它不等于使用列表推导创建一个全新的列表,然后返回第一个元素。

答案 1 :(得分:3)

您还可以使用next()

In [1]: l = [("a", 1), ("b", 2), ("c", 3)]

In [2]: next(a for a, b in l if b == 2)
Out[2]: 'b'

请注意,除非提供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

答案 2 :(得分:1)

这取决于如何支付,空间或时间。你不能兼得。

1如果我们想加快速度:

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

2如果空间有限,请尝试下一个回答或循环。