Python检查值是否在dicts列表中

chr*_*ism 5 python

我有一个dicts列表,例如

[{'name':'Bernard','age':7},{'name':'George','age':4},{'name':'Reginald','age':6}]
Run Code Online (Sandbox Code Playgroud)

我想检查一下字符串值是否与列表中任何一个dicts中的'name'值相同.例如'Harold'将是False,但'George'将是True.

我意识到我可以通过循环遍历列表中的每个项目来做到这一点,但我想知道是否有更有效的方法?

eum*_*iro 14

不,如果您只有这个dicts列表,就不会有更有效的方法.

但是,如果要经常检查,可以提取名称为:age items的字典:

l = [{'name':'Bernard','age':7},{'name':'George','age':4},{'name':'Reginald','age':6}]
d = dict((i['name'], i['age']) for i in l)
Run Code Online (Sandbox Code Playgroud)

现在你有d:

{'Bernard': 7, 'George': 4, 'Reginald': 6}
Run Code Online (Sandbox Code Playgroud)

现在你可以检查:

'Harold' in d   -> False
'George' in d   -> True
Run Code Online (Sandbox Code Playgroud)

它比迭代原始列表要快得多.

  • 或者更好的是,将其提取到一组中.`s = set((i ['name'] for i in l))`.+1 (7认同)
  • 注意:如果你只有一个dicts列表,**是一个更有效的方法,例如,你可以将它排序为`L.sort(key = itemgetter('name'))`并使用`bisect`模块执行二进制搜索.在实践中,您将使用@Chinmay Kanchi建议的集合或使用`any()`进行线性搜索,如@ KennyTM的答案http://stackoverflow.com/questions/6041981/python-check-if-value-is-in -a-列表的-类型的字典/ 6042003#6042003 (2认同)

And*_*ley 7

正确的解决方案

与循环相比,有一种更有效的方法.如果你使用operators.itemgetter你可以做一个简单的if x in y check

#to simply check if the list of dicts contains the key=>value pair
'George' in map(itemgetter('name'), list_of_dicts)

#if you want to get the index 
index = map(itemgetter('name'), list_of_dicts).index("George") if 'George' in map(itemgetter('name'), list_of_dicts) else None
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您使用的是Python 3:`list(map(itemgetter('name'),list_of_dicts)).index('George')`.也可以把它放在`try ..除了ValueError`之外,以防没有找到`list.index()`的项,而不是做两个`itemgetter()`查找. (3认同)