Python: получить dict из списка на основе чего-то внутри dict
Мне нужно найти элемент в list
(элемент в этом случае является dict
) на основе некоторого значения внутри dict
. Структура list
, которую мне нужно обработать, выглядит следующим образом:
[
{
'title': 'some value',
'value': 123.4,
'id': 'an id'
},
{
'title': 'another title',
'value': 567.8,
'id': 'another id'
},
{
'title': 'last title',
'value': 901.2,
'id': 'yet another id'
}
]
Предостережения: title
и value
могут быть любым значением (и тем же), id
будет уникальным.
Мне нужно получить dict
из этого list
на основе уникального id
. Я знаю, что это можно сделать с помощью циклов, но это кажется громоздким, и я чувствую, что существует очевидный способ сделать это, что я не вижу, благодаря расплавлению мозга.
Ответы
Ответ 1
my_item = next((item for item in my_list if item['id'] == my_unique_id), None)
Это повторяется через список, пока не найдет первый элемент, соответствующий my_unique_id
, а затем остановится. Он не хранит промежуточные списки в памяти (с использованием выражения генератора) или требует явного цикла. Он устанавливает my_item
в None
, поскольку объект не найден. Он примерно такой же, как
for item in my_list:
if item['id'] == my_unique_id:
my_item = item
break
else:
my_item = None
else
в циклах for
используются, когда цикл не заканчивается оператором break
.
Ответ 2
Если вам нужно сделать это несколько раз, вы должны воссоздать dictionnary, индексированный по id, с вашим списком:
keys = [item['id'] for item in initial_list]
new_dict = dict(zip(keys, initial_list))
>>>{
'yet another id': {'id': 'yet another id', 'value': 901.20000000000005, 'title': 'last title'},
'an id': {'id': 'an id', 'value': 123.40000000000001, 'title': 'some value'},
'another id': {'id': 'another id', 'value': 567.79999999999995, 'title': 'another title'}
}
или в однострочном режиме, как предложено agf:
new_dict = dict((item['id'], item) for item in initial_list)
Ответ 3
Работал только с iter()
для меня:
my_item = next(iter(item for item in my_list if item['id'] == my_unique_id), None)
Ответ 4
На всякий случай, если вы хотите выполнить поиск по ключу словаря.
my_item = next((item for item in my_list if item.has_key(my_unique_key)), None)
Для 3. 0+, has_key()
устарела. Вместо этого используйте in
:
my_item = next((item for item in mylist if 'my_unique_key' in item), None)
https://docs.python.org/3.0/whatsnew/3.0.html#builtins
Ответ 5
In [2]: test_list
Out[2]:
[{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001},
{'id': 'another id', 'title': 'another title', 'value': 567.79999999999995},
{'id': 'yet another id', 'title': 'last title', 'value': 901.20000000000005}]
In [3]: [d for d in test_list if d["id"] == "an id"]
Out[3]: [{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001}]
Использовать список символов
Ответ 6
С этой целью вы можете создать простую функцию:
lVals = [{'title': 'some value', 'value': 123.4,'id': 'an id'},
{'title': 'another title', 'value': 567.8,'id': 'another id'},
{'title': 'last title', 'value': 901.2, 'id': 'yet another id'}]
def get_by_id(vals, expId): return next(x for x in vals if x['id'] == expId)
get_by_id(lVals, 'an id')
>>> {'value': 123.4, 'title': 'some value', 'id': 'an id'}