Python list of dictionaries search Python list of dictionaries search python python

Python list of dictionaries search


You can use a generator expression:

>>> dicts = [...     { "name": "Tom", "age": 10 },...     { "name": "Mark", "age": 5 },...     { "name": "Pam", "age": 7 },...     { "name": "Dick", "age": 12 }... ]>>> next(item for item in dicts if item["name"] == "Pam"){'age': 7, 'name': 'Pam'}

If you need to handle the item not being there, then you can do what user Matt suggested in his comment and provide a default using a slightly different API:

next((item for item in dicts if item["name"] == "Pam"), None)

And to find the index of the item, rather than the item itself, you can enumerate() the list:

next((i for i, item in enumerate(dicts) if item["name"] == "Pam"), None)


This looks to me the most pythonic way:

people = [{'name': "Tom", 'age': 10},{'name': "Mark", 'age': 5},{'name': "Pam", 'age': 7}]filter(lambda person: person['name'] == 'Pam', people)

result (returned as a list in Python 2):

[{'age': 7, 'name': 'Pam'}]

Note: In Python 3, a filter object is returned. So the python3 solution would be:

list(filter(lambda person: person['name'] == 'Pam', people))


@Frédéric Hamidi's answer is great. In Python 3.x the syntax for .next() changed slightly. Thus a slight modification:

>>> dicts = [     { "name": "Tom", "age": 10 },     { "name": "Mark", "age": 5 },     { "name": "Pam", "age": 7 },     { "name": "Dick", "age": 12 } ]>>> next(item for item in dicts if item["name"] == "Pam"){'age': 7, 'name': 'Pam'}

As mentioned in the comments by @Matt, you can add a default value as such:

>>> next((item for item in dicts if item["name"] == "Pam"), False){'name': 'Pam', 'age': 7}>>> next((item for item in dicts if item["name"] == "Sam"), False)False>>>