Есть ли способ поиска по ключу в диктовке в списке, даже если вы не уверены, где находится словарь? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть странный файл JSON для работы.Я пытаюсь найти ключ dt в словаре в списке.Проблема в том, что иногда это может быть что-то вроде словаря в списке в списке или словарь в словаре или списке.

Клавиша "dt" существует, но позиция не гарантируется.Есть ли способ для меня, чтобы получить этот ключ?Сначала я попытался использовать много операторов if и for, но понял, что это будет слишком много.

Затем я попытался преобразовать файл json в строку и использовать re.search для поиска {'dt':, но я не был уверен в этой точности.Есть ли способ найти ключ "dt", не зная точного положения словаря?Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Это то, что вы искали? Обратите внимание, что я не проверял все варианты использования, потому что я не знаю всех из них. Думаю, это должно охватывать все из них, но, пожалуйста, подтвердите. Код может быть улучшен до такой степени - это только начальная версия, надеюсь, вы сможете улучшить его :)

funcIter - это функция, которая вызывается снова и снова, пока не будет найдено dt. Он проверяет, имеет ли тип ввода dictionary, а затем перебирает объект словаря, чтобы найти ключ. Если он любого другого типа, если предполагает , он относится к списку типов (вы можете добавить еще одну проверку для проверки типа list), а затем захватывает первый элемент.

dicObject = {"value" :[{"dt":12345}]}

def funcIter(items):
    if(isinstance(items, dict)):
        for key, value in items.items():
            if key.startswith('dt'):
                print (key, value)
            else:
                funcIter(value)
    else:
        indexes = [n for n, x in enumerate(items) if x == 'dt']
        if(len(indexes) < 1):
            funcIter(items[0])
        else:
            print(items[0])
    pass


funcIter(dicObject)
1 голос
/ 12 июня 2019

Я наконец сделал это!Все, что было нужно, это рекурсивная функция.Ниже приводится функционирующая рекурсивная функция.

def findDT(givenThing, key):
if isinstance(givenThing, dict):
    for a in givenThing.keys():
        if a == key:
            print(givenThing[key])
            return givenThing[key]
        else:
            findDT(givenThing[a], key)
elif isinstance(givenThing, list):
    for a in givenThing:
        if isinstance(a, list) or isinstance(a, dict):
            givenThing = a
            findDT(givenThing, key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...