python проверить, есть ли у dict вложенные элементы - PullRequest
2 голосов
/ 17 апреля 2020

Что такое pythoni c способ проверки наличия вложенных элементов в dict

Примеры

hasNestedElt({'a': 1, 'b': 2}) #=> False
hasNestedElt({'a': 1, 'b': {'c': 3} }) #=> True
hasNestedElt({'a': 1, 'b': ('c', 3) }) #=> False
hasNestedElt({'a': 1, 'b': ('c', 3, 'x') }) #=> False
hasNestedElt({'a': 1, 'b': ('c', (3, 'x')) }) #=> True
hasNestedElt({'a': 1, 'b': ('c', (3, {'d': 4})) }) #=> True

Один из способов - это перебирать элементы в dict и проверять тип как ниже и сокращение списка res. Однако это становится громоздким с вложенными элементами, имеющими кортежи с различной длиной.

res = []
for k, v in dct:
  if isinstance(v, (str, int):
    res.append(False)
  elif isinstance(v, tuple) & len(v) == 2:
    if isinstance(v[0], (str,int)) and isinstance(v[1], (str,int)):
      res.append(False)
    else: res.append(True)

1 Ответ

1 голос
/ 17 апреля 2020

Как отмечается в комментариях, вы можете использовать any() здесь:

Возвращать True, если какой-либо элемент итерируемого равен true. Если итерация пуста, вернуть False

. Код, приведенный ниже, выполняет итерацию значений из словаря, если мы находим dict return True. Если мы найдем tuple, проверьте, являются ли какие-либо подэлементы tuple или dict, а затем верните True, если мы найдем какие-либо элементы. В противном случае верните False, если мы дойдем до конца функции и не найдены вложенные элементы. Это предполагает, что вы не обрабатываете list или любой другой тип коллекции, что не является проблемой и может быть легко добавлено в приведенный ниже код.

def hasNestedElt(dic):
    for v in dic.values():
        if isinstance(v, dict):
            return True
        elif isinstance(v, tuple):
            if any(isinstance(x, (dict, tuple)) for x in v):
                return True
    return False

Контрольные примеры:

>>> hasNestedElt({'a': 1, 'b': 2}))
False
>>> hasNestedElt({'a': 1, 'b': {'c': 3} })
True
>>> hasNestedElt({'a': 1, 'b': ('c', 3) }) 
False
>>> hasNestedElt({'a': 1, 'b': ('c', 3, 'x') })
False
>>> hasNestedElt({'a': 1, 'b': ('c', (3, 'x')) })
True
>>> hasNestedElt({'a': 1, 'b': ('c', (3, {'d': 4})) })
True
...