Вы можете определить рекурсивный генератор с помощью try
/ except
:
def recursive_keys(d):
for k, v in d.items():
try:
yield from recursive_keys(v)
except AttributeError:
yield k
'name' in set(recursive_keys(data)) # True
Если вы предпочитаете, вы можете использовать isinstance
вместо:
def recursive_keys(d):
for k, v in d.items():
if isinstance(v, dict):
yield from recursive_keys(v)
else:
yield k
Это относительно дорого, поскольку вы сначала создаете set
всех ключей, прежде чем проверять, существует ли элемент в set
. Согласно комментарию @ pault, вы можете использовать:
any(x == 'name' for x in recursive_keys(data))
Для ленивого решения без генераторов см. @ решение DanielMesejo . Это может быть более эффективным, поскольку позволяет избежать дорогостоящих вызовов __next__
.