#python #python_3x #поиск #списки
Здравствуйте. Есть многомерный список:
spisok=[{'a':'1','b':'2'},{'a':'3','b':'4'}]
необходимо проверить есть ли в списке ключ 'a' с определенным значением.
поискав в интернете смог собрать такую конструкцию:
for i in range(len(spisok)):
if spisok[i]['a'] == stroka_poiska:
print('True')
Можно ли как то улучшить данный код? И верна ли логика построения алгоритма?
Ответы
Ответ 1
Попробуйте так: def chk_for_val(lst, key, val): for d in lst: if d.get(key) == val: return True return False При использовании dict.get(key) (вместо dict[key]) - не будут генерироваться исключения для несуществующих ключей In [138]: chk_for_val(lst, 'a', '3') Out[138]: True In [139]: chk_for_val(lst, 'X', '3') Out[139]: FalseОтвет 2
Самый лучший вариант: check = any(dct.get('a')==stroka_poiska for dct in spisok) print(check) Лаконично, читабельно и эффективно.Ответ 3
Предложу свой немного странноватый вариант: In [17]: array = [{'a':'1','b':'2'},{'a':'3','b':'4'}] In [18]: def search(dictionary, key, value): ...: verbose_data = sum(map(list, map(dict.items, dictionary)), []) ...: return (key, value) in verbose_data ...: In [19]: search(array, 'a', '1') Out[19]: True In [20]: search(array, 'a', '4') Out[20]: False Или: In [27]: search = lambda array, key, value: any(map(lambda x: (key, value) in x.items(), array)) In [28]: search(array, 'a', '1') Out[28]: True In [29]: search(array, 'A', '1') Out[29]: False Или: In [13]: from itertools import takewhile In [14]: def search(array, key, value): ...: return len(list(takewhile(lambda x: x.get(key) != value, array))) < len(array) ...: In [15]: search(array, 'a', '3') Out[15]: True In [16]: search(array, 'A', '3') Out[16]: FalseОтвет 4
В стандартной библиотеке collections есть класс отображения ChainMap. Он хранит список отображений, так что их можно просматривать как единое целое. Поиск производится в каждом отображении по порядку и завершается успешно, если ключ найден хотя бы в одном. from collections import ChainMap spisok=[{'a':'1','b':'2'},{'a':'3','b':'4'}] chain = ChainMap(*spisok) print(chain.get('a')) документацияОтвет 5
Я вот так сделал: for i in range(len(spisok)): for key in spisok[i]: if spisok[i][key]=='4': print(spisok[i][key])
Комментариев нет:
Отправить комментарий