Как проверить, существует ли несколько ключей во вложенном (всем) словаре? - PullRequest
0 голосов
/ 10 июля 2020

Чтобы проверить, существует ли 'b' & 'c' в 'a' & 'b'.

test = {
    'a': {
        'b': [1234],
        'c': 'some_value'
    },
    'd': {
        'b': [5678],
        'c': ''
    }
}

Подход 1: работает, как показано ниже, но не очень хорошая реализация, если количество вложенных словарей огромно. Кроме того, вы не можете точно определить, какой элемент не существует. Скажем, 'c' not in 'a' , 'b' not in 'd' & 'c' not in 'd'. В этом случае он терпит неудачу во втором операторе (но не сообщает, что 3-й и 4-й операторы также терпят неудачу). Мне нужно получить, а всего этого не существует.

try:
   v1 = test['a']['b']
   v2 = test['a']['c']
   v3 = test['d']['b']
   v4 = test['d']['c']
except Exception as err:
   print(err)

Подход 2:

for k,v in test.items():
   if 'b' not in v:
       print("'b' doesn't exist in {}".format(test[k][v]))
   if 'c' not in v:
       print("'c' doesn't exist in {}".format(test[k][v]))

Approach1 и Approach2 кажутся не очень хорошими . Есть ли другие способы справиться с этим лучше?

1 Ответ

0 голосов
/ 10 июля 2020

Если есть только два уровня вложенности, не могли бы вы попытаться подсчитать появление ключей в словарях более низкого уровня? Например:



counter  = {}
for el in test.keys():
    for subkey in test.get(el).keys():
        if subkey not in counter.keys():
            counter[subkey] = 1.0
        else:
            counter[subkey] += 1.0


он вернет


{'b': 2.0, 'c': 2.0}

на основе этого вы можете идентифицировать повторяющиеся значения во вложенных ключах.

Затем вы можете использовать set посмотреть, на каких ключах существуют дубликаты:

дубликаты ключей

counter = {k : v for k, v in counter.items() if v > 1}    

#get only values with dupe records

{k:v for k, v in test.items()  if len(set(counter.keys()).intersection(v)) > 0}


> {'a': {'b': [1234], 'c': 'some_value'}, 'd': {'b': [5678], 'c': ''}}
...