Как получить значения словаря по ключевому пути - PullRequest
1 голос
/ 07 июля 2019

У меня есть 2 словаря.Dict 1: значения являются путем к ключу второго dict.

Мне нужно получить ключ и значение из get Dict 1, а с путем получить значение из Dict 2.

dict2:

dict2 = { 
          "s0" : 
          {
             "s1"  :  {
                   "s1_f1":"s1_v1",
                   "s1_f2" : "s1_v2"
                 },
              "s2":   {
                   "s2_f1":"s2_v1",
                   "s2_f2" : "s2_v2",
                   "s2_f3" : {
                                "s3_f1":"s3_v1"
                             }
                 }
          }
}   

dict1:

dict1 = {
        "d0_f1":"s0/s1/s1_f1",
        "d3_f1" : "s0/s2/s2_f3/s3_f1",
        "d1_f1":"s0/s2/s2_f1",
        "d1_f2" :"s0/s2/s2_f2"
      }

Выход:

Длякаждый ключ и значение из dict1 получают значения ключей в dict2 в dict 1 значение

{"d0_f1" = "s1_v1"}

код:

def find_in_input_json(element, input_json):
    keys = element.split('/')
    rv = input_json
    for key in keys:
        rv = rv[key]
    return rv
value = find_in_input_json(key_value, input_json)
print(value)

Это даетсообщение об ошибке

AttributeError: 'dict' object has no attribute 'split'

1 Ответ

0 голосов
/ 07 июля 2019

New answer - (Final updated)

@ vartika, спасибо за обновление проблемы с желаемым i / p & o / p, поскольку это помогло мне помочь вам.

Вы можете использовать приведенный ниже код для выполнения задачи или решения этой проблемы.Я закомментировал несколько строк, чтобы прояснить мои соображения, и я думаю, что код понятен и прост для понимания.

Вы можете комментировать, если обнаружите какие-либо трудности.

def find_in_input_json(element, input_json):
    values = {} # Output dictionary with key in dict1: matched value

    for d_f in dict1:
        path = dict1[d_f]       # "s0/s1/s1_f1"
        paths = path.split('/') # ['s0', 's1', 's1_f1']
        rv = input_json

        for s in paths: # s: s0 -> s1 -> s1_f1 (one by one)
            if s in rv:
                rv = rv[s] # Update input_json with new dictionary pointed by current matched key

        values[d_f] = rv # {'d0_f1': 's1_v1'} ->  {'d0_f1': 's1_v1', 'd3_f1': 's3_v1'} -> so...on

    return values


if __name__ == '__main__':
    dict1 = {
        "d0_f1": "s0/s1/s1_f1",
        "d3_f1": "s0/s2/s2_f3/s3_f1",
        "d1_f1": "s0/s2/s2_f1",
        "d1_f2": "s0/s2/s2_f2"
    }

    dict2 = {
        "s0": {
            "s1": {
                "s1_f1": "s1_v1",
                "s1_f2": "s1_v2"
            },
            "s2": {
                "s2_f1": "s2_v1",
                "s2_f2": "s2_v2",
                "s2_f3": {
                    "s3_f1": "s3_v1"
                }
            }
        }
    }

    values = find_in_input_json(dict1, dict2)
    print(values) # {'d0_f1': 's1_v1', 'd3_f1': 's3_v1', 'd1_f1': 's2_v1', 'd1_f2': 's2_v2'}

Old answer

@ vartika, как я понял из проблемы и комментариев, у вас есть вложенный словарь с любым списком в нем.

Так что я просторассмотрим следующий список.

Здесь я создал 2 словаря, key_value & input_json.

Внутри функции, я делаю следующие операции.

  • Получить значение ключа element в словаре key_value.

  • element - это строка (path) /, разделенная, т. Е. '/Users/hygull/Desktop/Python3/file1/output', так что использование метода split() здесь хорошо, как вы использовали в своем коде.

  • Наконец, я перебираю элементы пути и также проверяю, является ли этот элемент пути ключомв input_json.Если он захватывает соответствующее значение и выходит из цикла.

  • Возвращает значение вызывающей стороне.

Теперь вы можете взглянуть на приведенный ниже код.

def find_in_input_json(element, input_json):
    # Fetch element keys value
    element = element['file']["element"] # '/Users/hygull/Desktop/Python3/file1/output'

    keys = element.split('/') 
    print(keys) # ['', 'Users', 'hygull', 'Desktop', 'Python3', 'file2', 'output']

    rv = input_json

    for key in keys:
        if key in rv:     # 'file2' key is in input_json
            rv = rv[key]  # Get its value
            break         # Exit from loop, don't go further 

    return rv             # Return the value


if __name__ == '__main__':
    # TEST CASE 1
    key_value = {
        'file': {
            'name': 'a.py',
            'element': '/Users/hygull/Desktop/Python3/file2/output',
            'children': [
                'b.py',
                'c.py'
            ]
        }
    }

    input_json = {
        'file1': {
            'name': 'a.py',
            'element': '/Users/hygull/Desktop/Python3/file2/output',
            'children': [
                'b.py',
                'c.py'
            ]
        },
        'file2': {
            'name': 'c.py',
            'element': '/Users/hygull/Desktop/Python3/file1/output',
            'children': [
                'd.py',
                'e.py'
            ]
        },
        'file3': {
            'name': 'x.py',
            'element': '/Users/hygull/Desktop/Python3/file4/output',
            'children': [
                'y.py',
                'z.py'
            ]
        }
    }

    value = find_in_input_json(key_value, input_json)
    print(value) # {'name': 'c.py', 'element': '/Users/hygull/Desktop/Python3/file1/output', 'children': ['d.py', 'e.py']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...