Как проверить, существует ли ключ в списке dicts в python?
Скажем, у меня есть список dicts, который выглядит так:
[{1: "a"}, {2: "b"}]
Каков питонический способ указать, находится ли какой-либо ключ в одном из списков в списке?
Ответы
Ответ 1
Я бы, наверное, написал:
>>> lod = [{1: "a"}, {2: "b"}]
>>> any(1 in d for d in lod)
True
>>> any(3 in d for d in lod)
False
хотя, если в этом списке будет много dicts, вам может потребоваться пересмотреть структуру данных.
Если вам нужен индекс и/или словарь, в котором найдено первое совпадение, один подход заключается в использовании next
и enumerate
:
>>> next(i for i,d in enumerate(lod) if 1 in d)
0
>>> next(d for i,d in enumerate(lod) if 1 in d)
{1: 'a'}
>>> next((i,d) for i,d in enumerate(lod) if 1 in d)
(0, {1: 'a'})
Это приведет к повышению StopIteration
, если оно не существует:
>>> next(i for i,d in enumerate(lod) if 3 in d)
Traceback (most recent call last):
File "<ipython-input-107-1f0737b2eae0>", line 1, in <module>
next(i for i,d in enumerate(lod) if 3 in d)
StopIteration
Если вы хотите этого избежать, вы можете либо поймать исключение, либо передать next
значение по умолчанию, например None
:
>>> next((i for i,d in enumerate(lod) if 3 in d), None)
>>>
Как отмечено в комментариях @drewk, если вы хотите получить несколько индексов, возвращаемых в случае нескольких значений, вы можете использовать понимание списка:
>>> lod = [{1: "a"}, {2: "b"}, {2: "c"}]
>>> [i for i,d in enumerate(lod) if 2 in d]
[1, 2]
Ответ 2
Используйте функцию any
с генератором:
>>> d = [{1: "a"}, {2: "b"}]
>>> any(1 in x for x in d)
True
Функция any
возвращает True
, если хотя бы один элемент в iterable
, переданный ей, равен True
. Но вам действительно нужно учитывать, почему у вас нет всех пар key: value
в одном dict
?
Ответ 3
parsedData=[]
dataRow={}
if not any(d['url'] == dataRow['url'] for d in self.parsedData):
self.parsedData.append(dataRow)
Ответ 4
Чтобы увидеть в одном дикторе мы используем ключевое слово 'in':
key in dic_instance
Чтобы проверить список словарей, перебирайте список словарей и используйте функцию "any", поэтому, если ключ найден в любом словаре, он не будет перебирать список дальше.
dic_list = [{1: "a"}, {2: "b"}]
any(2 in d for d in dic_list)
True
any(4 in d for d in dic_list)
False
Ответ 5
Для поиска в глубоко вложенной структуре данных я использовал этот код для рекурсивного поиска ключей в списках и словарях.
def isKey(dictORlist, key):
# dictORlist is the data structure you want to search
# key is the keyword you want to search for
def checkList(List, key):
if isinstance(List, list):
for i in List:
return isKey(i, key)
result = checkList(dictORlist, key)
if isinstance(dictORlist, dict):
for k in dictORlist.keys():
data = dictORlist[k]
if k == key:
return True
elif isinstance(data, dict):
result = isKey(data, key)
else:
result = checkList(data, key)
if result == None:
result = False
return result