Вопрос-Ответ

Search a list of dictionaries in Python

Поиск по списку словарей на Python

Дано:

[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]

Как мне выполнить поиск по name == "Pam", чтобы получить соответствующий словарь ниже?

{"name": "Pam", "age": 7}
Переведено автоматически
Ответ 1

Вы можете использовать выражение-генератор:

>>> 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'}

Если вам нужно обработать элемент, которого там нет, то вы можете сделать то, что пользователь Мэтт предложил в своем комментарии, и указать значение по умолчанию, используя немного другой API:

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

И чтобы найти индекс элемента, а не сам элемент, вы можете enumerate() список:

next((i for i, item in enumerate(dicts) if item["name"] == "Pam"), None)
Ответ 2

Мне кажется, это самый питонистский способ:

people = [
{'name': "Tom", 'age': 10},
{'name': "Mark", 'age': 5},
{'name': "Pam", 'age': 7}
]

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

результат (возвращается в виде списка в Python 2):

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

Примечание: В Python 3 возвращается объект filter . Таким образом, решение python3 будет:

list(filter(lambda person: person['name'] == 'Pam', people))
Ответ 3

Ответ Фредерика Хамиди великолепен. В Python 3.x синтаксис для .next() немного изменился. Таким образом, небольшая модификация:

>>> 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'}

Как упоминалось в комментариях @Matt, вы можете добавить значение по умолчанию как таковое:

>>> 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
>>>
Ответ 4

Вы можете использовать понимание списка:

def search(name, people):
return [element for element in people if element['name'] == name]
python dictionary