Замените значения json ключами, основанными на другом json в python

#python-3.x

#python-3.x

Вопрос:

Я совершенно новичок в python, и я застрял в этом.

У меня есть два файла json с одинаковыми ключами и разными значениями, как показано ниже, и все значения уникальны и не повторяются.

 srce_d1 = {'key1': 'val1', 'key2': 'val2', 'key3': 'val3', 'key4': 'val4', 'key5': 'val5'}

dest_d2 = {'key1': 'val4', 'key2': 'val7', 'key3': 'val1', 'key4': 'val2', 'key5': 'val8'}
  

Мне нужно изменить порядок / поменять местами значения dest_d2 в соответствии с парами ключ-значение на основе source_d1. Чтобы объяснить, в dest_d2 для key1 соответствующим значением является value1 . Я должен искать value1 среди всех значений и заменять его значением key1 и так далее, пока не получу общие пары ключ-значение и остальные ключевые значения.

Мой измененный dest_d2 должен быть таким, как показано ниже, на каждой итерации,

 dest_d2 = {'key1': 'val4', 'key2': 'val7', 'key3': 'val1', 'key4': 'val2', 'key5': 'val8'}

dest_d2 = {'key1': 'val1', 'key2': 'val7', 'key3': 'val4', 'key4': 'val2', 'key5': 'val8'}

dest_d2 = {'key1': 'val1', 'key2': 'val2', 'key3': 'val4', 'key4': 'val7', 'key5': 'val8'}
  

И мой конечный желаемый выходной json должен быть,

 dest_d2 = {'key1': 'val1', 'key2': 'val2', 'key3': 'val7', 'key4': 'val4', 'key5': 'val8'}
  

И в конце у меня будут общие пары ключ-значение (key1, key2, key4) в обоих файлах json, и порядок других пар ключ-значение не имеет значения, но они мне все равно нужны.

Ниже приведен мой код, но он вообще не работает.

     def verify_values(des_json_obj, src_json_file):
        file_val = open(src_json_file)
        src_json_val = json.load(file_val)
        output_json = {}
        for _,value1 in des_json_obj.items():
            for key,value in src_json_val.items():
                if value == value1:
                    output_json[key] = value
        return output_json
  

Комментарии:

1. Я не совсем понимаю, чего вы хотите добиться. Меня немного смущает iterations в вашем вопросе — это те переходные этапы, которые, как вы предполагаете, будет производить код, пока он разрабатывает окончательное решение ? Как будет выглядеть желаемый конечный результат — точно? Пожалуйста, отредактируйте свой вопрос (отредактируйте ссылку под вопросом) , чтобы добавить эти детали.

2. @gibberish, да, вы правы, я ожидаю, что итерации будут частью цикла, в котором происходит замена, и я получу окончательный желаемый результат.

Ответ №1:

Я думаю, это сделает то, что вы хотите:

 srce_d1 = {'key1': 'val1', 'key2': 'val2', 'key3': 'val3', 'key4': 'val4', 'key5': 'val5'}
dest_d2 = {'key1': 'val4', 'key2': 'val7', 'key3': 'val1', 'key4': 'val2', 'key5': 'val8'}
res = {k:v if k not in source_d1 else source_d1[k] for k,v in dest_d2.items()}
print(res)
  

Пример:https://trinket.io/python/cd86b81a14

Комментарии:

1. Это почти сделало это, но все равно у меня получается такой же результат, как и исходный json. Приведенный выше код выдает результат, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4', 'key5': 'value5'} тогда как мой идеальный ожидаемый результат должен быть, {'key1': 'value1', 'key2': 'value2', 'key3': 'value7', 'key4': 'value4', 'key5': 'value8'}

2. @DeenadayalanS Можете ли вы объяснить шаги, которые приводят к 'key3': 'val7' ?

3. Ниже приведены итерации для получения значений пары ключей, dest_d2 = {'key1': 'val4', 'key2': 'val7', 'key3': 'val1', 'key4': 'val2', 'key5': 'val8'} первая итерация, фактическое значение key1 согласно исходному json, равно val1 . В настоящее время он присутствует в key3 и его нужно переместить в key1, поэтому мне нужно поменять val1 на val4, который находится в key1, и теперь мой json будет выглядеть так, dest_d2 = {'key1': 'val1', 'key2': 'val7', 'key3': 'val4', 'key4': 'val2', 'key5': 'val8'} И так далее, пока я не получу результат dest_d2 = {'key1': 'val1', 'key2': 'val2', 'key3': 'val4', 'key4': 'val7', 'key5': 'val8'}