Помощь Python с извлечением значения из списка - PullRequest
1 голос
/ 05 августа 2011
lst = [{"id": 1, "name": "ernest"}, .... {"id": 16, name:"gellner"}]

for d in lst:
    if "id" in d and d["id"] == 16:
        return d

Я хочу извлечь из списка словарь, в котором ключ "id" равен "16".

Есть ли более питонический способ этого?

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 05 августа 2011

По существующим ответам, чтобы получить из комментариев:

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

d16 = (d for d in lst if d.get('id') == 16).next()

Это шаблон, который вы часто будете видеть в моем коде. Это повысит StopIteration, если окажется, что в lst не было предметов, которые соответствовали бы условию. Когда это произойдет, вы можете поймать исключение:

try:
    d16 = (d for d in lst if d.get('id') == 16).next()
except StopIteration:
    d16 = None

Или еще лучше, просто разверните все это в цикл for, который останавливается

for d16 in lst:
    if d16.get('id') == 16:
        break
else:
    d16 = None

(предложение else: запускается только в том случае, если цикл for исчерпывает свои входные данные, но пропускается, если цикл for заканчивается, потому что использовался break)

2 голосов
/ 05 августа 2011

Это делает это.Независимо от того, является ли это "чище", это личный вызов.

d16 = [d for d in lst if d.get('id', 0) == 16][0]

Этот первоначальный подход не работает, если нет словаря с идентификатором 0. Вы можете преодолеть это примерно так:

d16 = [d for d in lst if d.get('id', 0) == 16]
if d16: d16 = d16[0]

Это предотвратит ошибку индекса, но d16 будет пустым списком, если в контейнере нет словаря, соответствующего критериям.

1 голос
/ 05 августа 2011

Одно небольшое улучшение, если не найдено:

d16 = ([d for d in lst if d.get('id', 0) == 16] + [None])[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...