Подтвердить что ты не робот

Как проверить, существует ли ключ в списке dicts в python?

Скажем, у меня есть список dicts, который выглядит так:

[{1: "a"}, {2: "b"}]

Каков питонический способ указать, находится ли какой-либо ключ в одном из списков в списке?

4b9b3361

Ответ 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