Поиск в списке из словарей
У меня список из словарей:
my_list = [{'a':'1', 'inplay':'True', 'b':'2'},
{'c':'3', 'd':'4'},
{'e':'5', 'inplay':'False', 'f':'6'}]
Мне необходимо получить индекс элемента списка, то есть порядковый номер того словаря, в котором inplay == 'False'. Чтобы ответ был 2.
Ответы (2 шт):
Вариант реализации: пройтись по всем словарям --- лементам списка, для каждого проверить:
- Если ключа нет, сразу пропускаем словарь
- Если ключ есть, то, если значение по ключу совпадает с переданным в функцию, вернём индекс элемента и сам элемент внутри кортежа.
def find_by_key(iterable, key, value):
for index, dict_ in enumerate(iterable):
if key in dict_ and dict_[key] == value:
return (index, dict_)
In [10]: my_list = [{'a':'1', 'inplay':'True', 'b':'2'},
...: {'c':'3', 'd':'4'},
...: {'e':'5', 'inplay':'False', 'f':'6'}]
In [11]: find_by_key(my_list, "inplay", "False")
Out[11]: (2, {'e': '5', 'f': '6', 'inplay': 'False'})
Если хочется найти все элементы, удовлетворяющие условию, можно создать функцию-генератор:
def find_all_by_key(iterable, key, value):
for index, dict_ in enumerate(iterable):
if key in dict_ and dict_[key] == value:
yield (index, dict_)
In [22]: my_list = [{"inplay": "False", "a": 1},
...: {"inplay": "True", "a": 37},
...: {"inplay": "False", "a": 153, "b": "hello"}]
In [23]: list(find_all_by_key(my_list, "inplay", "False"))
Out[23]:
[(0, {'a': 1, 'inplay': 'False'}),
(2, {'a': 153, 'b': 'hello', 'inplay': 'False'})]
Эквивалентная запись:
def find_all_by_key(iterable, key, value):
return ((index, dict_) for index, dict_ in enumerate(iterable)
if key in dict_ and dict_[key] == value)
for result, dic_ in enumerate(my_list):
if dic_.get('inplay', '') == 'False':
break;
else:
result = None
Объяснение:
Функцией enumerate(), примененной к вашему списку my_list, получим в переменной result порядковое число очередного элемента, и в переменной dic_ сам элемент — словарь.
Методом .get('inplay', '') примененным к словарю dic_ мы получим dic_['inplay'], когда ключ 'inplay' существует, или пустую строку в противном случае.
Командой break мы окончим поиск высечением из цикла, только что мы нашли желанный индекс — этот индекс тут находится в переменной result.
Когда команда break не была применена, значит, когда желанный индекс не был найден, выполнится ветвь else (да, цикл for может иметь ветвь else), в которой мы присвоим переменной result какое-то значение для индикации, что поиск не был успешным.