Python:搜索元组列表
Python: search through list of 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 的方法来搜索此列表?
你也可以使用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'
请注意,除非提供 default
,否则如果没有找到,它将抛出 StopIteration
异常:
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
试试这个:
next(x for x in l if x[1] == 2)[0]
使用 next()
的优点是我们只迭代找到我们正在寻找的内容所需的最少数量的元素,所以不,它不等同于使用列表创建一个全新的列表理解,然后返回第一个元素。
这取决于希望如何付款,space或时间。你不能两者兼得。
1 如果我们要加速:
l = [ ("a",1), ("b",2), ("c",3) ]
_dict = {k:v for v,k in l}
print(_dict.get(2, None))
2 如果 space 有限,请尝试其他答案的下一个或您的循环。
我有一个元组列表,例如
>>> 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 的方法来搜索此列表?
你也可以使用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'
请注意,除非提供 default
,否则如果没有找到,它将抛出 StopIteration
异常:
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
试试这个:
next(x for x in l if x[1] == 2)[0]
使用 next()
的优点是我们只迭代找到我们正在寻找的内容所需的最少数量的元素,所以不,它不等同于使用列表创建一个全新的列表理解,然后返回第一个元素。
这取决于希望如何付款,space或时间。你不能两者兼得。
1 如果我们要加速:
l = [ ("a",1), ("b",2), ("c",3) ]
_dict = {k:v for v,k in l}
print(_dict.get(2, None))
2 如果 space 有限,请尝试其他答案的下一个或您的循环。