Предположим, у меня есть это:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
и поиск «Pam» в качестве имени, я хочу получить соответствующий словарь: {name: "Pam", age: 7}
Как этого добиться?
python
search
dictionary
Hellnar
источник
источник
[item for item in dicts if item["name"] == "Pam"][0]
?enumerate()
генерировать бегущий индекс:next(i for i, item in enumerate(dicts) if item["name"] == "Pam")
.Это выглядит для меня наиболее питоническим образом:
результат (возвращается в виде списка в Python 2):
Примечание. В Python 3 возвращается объект фильтра. Таким образом, решение python3 будет:
источник
len()
, вам нужноlist()
сначала вызвать результат. Или: stackoverflow.com/questions/19182188/…r
же как иlist
next(filter(lambda x: x['name'] == 'Pam', dicts))
@ Ответ Фредерика Хамиди отличный. В Python 3.x синтаксис для
.next()
слегка изменился. Таким образом, небольшое изменение:Как упоминалось в комментариях @Matt, вы можете добавить значение по умолчанию как таковое:
источник
Вы можете использовать понимание списка :
источник
источник
def search(list, key, value): for item in list: if item[key] == value: return item
Я протестировал различные методы, чтобы просмотреть список словарей и вернуть словари, в которых ключ x имеет определенное значение.
Результаты:
Все тесты выполнены на Python 3.6 .4, W7x64.
Результаты:
источник
Чтобы добавить чуть-чуть к @ FrédéricHamidi.
Если вы не уверены, что ключ находится в списке диктов, может помочь что-то вроде этого:
источник
item.get("name") == "Pam"
Вы когда-нибудь пробовали пакет с пандами? Он идеально подходит для такой задачи поиска и оптимизирован.
Ниже я добавил немного бенчмаркинга, чтобы проиллюстрировать более быстрое время выполнения панд в более широком масштабе, т.е. 100 000 записей:
источник
Это общий способ поиска значения в списке словарей:
источник
Это один из способов ...
источник
Просто используя понимание списка:
Образец кода:
источник
Вы можете достичь этого с помощью фильтра и следующих методов в Python.
filter
Метод фильтрует заданную последовательность и возвращает итератор.next
Метод принимает итератор и возвращает следующий элемент в списке.Таким образом, вы можете найти элемент,
и вывод есть,
Примечание. Приведенный выше код вернет
None
incase, если имя, которое мы ищем, не найдено.источник
Моей первой мыслью было бы, что вы, возможно, захотите создать словарь этих словарей ... если, например, вы собираетесь искать его более чем несколько раз.
Однако это может быть преждевременной оптимизацией. Что было бы не так с:
источник
источник
Один простой способ использования списочных представлений - это если
l
списоктогда
источник
Вы можете попробовать это:
источник
Вот сравнение с использованием итерации по списку, с использованием filter + lambda или рефакторингом (если необходимо или допустимо для вашего случая) вашего кода, чтобы диктовать его, а не список.
И вывод такой:
Вывод: очевидно, что наличие словаря словарей является наиболее эффективным способом поиска в тех случаях, когда, как вы знаете, вы будете искать только по идентификаторам. Интересно, что использование фильтра является самым медленным решением.
источник
Большинство (если не все) реализации, предложенные здесь, имеют два недостатка:
Обновленное предложение:
Возможно, не самый питонический, но, по крайней мере, немного более безопасный.
Применение:
Суть .
источник
Вы должны пройти через все элементы списка. Там нет ярлыка!
Если где-то еще вы не ведете словарь имен, указывающих на элементы списка, но тогда вы должны позаботиться о последствиях выталкивания элемента из вашего списка.
источник
Я нашел эту ветку, когда искал ответ на тот же вопрос. Хотя я понимаю, что это поздний ответ, я решил внести его, если он пригодится кому-то еще:
источник