Python - 从数组中选择具有某些属性的单个元素
我遇到过几次这样的情况:我有一个数组,里面有我想要的元素,但我不知道它的索引,只知道一些特定的属性(比如说,这可能是一个字典的列表,我想找到那个字典 elem
,使得 elem['foo'] == 'bar'
)。
我有一个解决办法,就是用过滤器(或者更符合Python风格的列表推导式),然后取第一个元素(很多时候我知道过滤后的列表只有一个元素,所以取第一个就是唯一的那个)。
举个例子,给定一个列表 x = [{'foo': 'bar_1'}, {'foo': 'bar_2'}]
,我想要的元素是 'foo'
值为 'bar_2'
的那个。所以我这样做:
y = [elem for elem in x if elem['foo'] == 'bar_2'][0]
有没有更标准的方法来实现这个呢?这看起来是一个非常简单和常见的用例。
2 个回答
1
你可以使用一个 generator
,通过调用 next
来获取第一个匹配的结果:
l = [{'foo': 'bar_1'}, {'foo': 'bar_2'}]
print next(d for d in l if d["foo"] == "bar_2")
{'foo': 'bar_2'}
d = (d for d in l if d["foo"] == "bar_2")
first = next(d)
你也可以使用 itertools.dropwhile,如果你想要前两个元素的话:
In [52]: from itertools import dropwhile,takewhile
In [53]: l = [{'foo': 'bar_1'}, {'foo': 'bar_2'},{'foo': 'bar_2',"goo":"bar"}]
In [54]: d = dropwhile(lambda x: x["foo"] != "bar_2",l) # drop elements whose where value of key "foo" is not equal to "bar_2"
In [55]: first = next(d)
In [56]: second = next(d)
In [57]: first
Out[57]: {'foo': 'bar_2'}
In [58]: second
Out[58]: {'foo': 'bar_2', 'goo': 'bar'}
1
如果你经常遇到这个问题,那就考虑换一种数据结构吧。想想看,使用字典列表(list of dicts)是否真的是解决你问题的最佳选择。如果是的话,可以加一个dict
来记录你需要的信息。在这种情况下,当你构建x
的时候,也可以同时构建index
:
index = {'bar2':x[1], 'bar1':x[0]}
查找字典的速度是O(1)
,而基于列表的查找速度是O(n)
。