Как переместить ключевое значение в списке словарей на один уровень вверх в python

#python #python-3.x #list #dictionary #scripting

#python #python-3.x #Список #словарь #сценарии

Вопрос:

Используя Python3, я пытаюсь переместить пару значений ключа в списке словарей на уровень выше.

У меня есть переменная с именем product, которая имеет следующее:

     [ 
    {'color': 'red', 
     'shape': 'round', 
     'extra': {'price': 'large', 
               'onsale': 'yes',
               'instock: 'yes'}
    }, 
    {'color': 'blue', 
     'shape': 'square', 
     'extra': {'price': 'small', 
               'onsale': 'no',
               'instock: 'yes'}
    }
    ]
  

Я хотел бы переместить пару значений ключа «instock» в пределах дополнительного на один уровень выше, чтобы соответствовать цвету, форме, дополнительному — так что это:

     [ 
    {'color': 'red', 
     'shape': 'round', 
     'extra': {'price': 'large', 
               'instock: 'yes'},
     'onsale': 'yes'
    }, 
    {'color': 'blue', 
     'shape': 'square', 
     'extra': {'price': 'small', 
               'onsale': 'no'},
     'instock: 'yes'
    }
    ]
  

Я попытался поиграть со следующим кодом, который я нашел здесь:

     result = {}
    for i in products:
        if i["href"] not in result:
            result[i["selection_id"]] = {'selection_id': i["selection_id"], 'other_data':                         i["other_data"], 'value_dict': []}
        result[i["selection_id"]]["value_dict"].append({'value': i["value"], "value_name": i["value_name"]})
  

У меня это не сработало.

Буду признателен за любую помощь или дополнительную литературу, которую я могу найти в Интернете!

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

1. «Это не сработало» Почему нет, что пошло не так? Вы не получили желаемый результат? Код вообще не выполнялся? Вы получили ошибку на полпути? Когда вы запрашиваете справку по отладке, чем больше релевантных сведений вы предоставите, тем лучше.

2. Для начала, это дает мне KeyError: ‘onsale’. Но, как показано в приведенном выше коде, у меня есть onsale в списке. Во-вторых, этот код, который я нашел, является решением, предоставленным для аналогичного запроса, который я нашел, не совсем то, что я искал, но я решил, что это хорошая отправная точка.

Ответ №1:

Очень просто: выполните итерацию по списку. Для каждого dict скопируйте «extra».»instock» на один уровень выше и удалите оригинал:

 for outer_dict in product:
    outer_dict["instock"] = outer_dict["extra"]["instock"]
    del outer_dict["extra"]["instock"]

for outer_dict in product:
    print(outer_dict)
  

Вывод:

 {'color': 'red', 'shape': 'round', 'extra': {'price': 'large', 'onsale': 'yes'}, 'instock': 'yes'}
{'color': 'blue', 'shape': 'square', 'extra': {'price': 'small', 'onsale': 'no'}, 'instock': 'yes'}
  

Ответ №2:

 lst = [ 
    {'color': 'red', 
     'shape': 'round', 
     'extra': {'price': 'large', 
               'onsale': 'yes',
               'instock': 'yes'}
    }, 
    {'color': 'blue', 
     'shape': 'square', 
     'extra': {'price': 'small', 
               'onsale': 'no',
               'instock': 'yes'}
    }
]

for d in lst:
    d['instock'] = d['extra'].pop('instock')

# pretty print on screen:
from pprint import pprint
pprint(lst)
  

С принтами:

 [{'color': 'red',
  'extra': {'onsale': 'yes', 'price': 'large'},
  'instock': 'yes',
  'shape': 'round'},
 {'color': 'blue',
  'extra': {'onsale': 'no', 'price': 'small'},
  'instock': 'yes',
  'shape': 'square'}]
  

Или вы могли бы использовать:

 d['extra'].pop('instock', 'no')
  

в случае отсутствия instock ключа ( no в этом случае используется значение по умолчанию)

Ответ №3:

 products = [
    {'color': 'red', 
     'shape': 'round', 
     'extra': {'price': 'large', 
               'onsale': 'yes',
               'instock': 'yes'}
    }, 
    {'color': 'blue', 
     'shape': 'square', 
     'extra': {'price': 'small', 
               'onsale': 'no',
               'instock': 'yes'}
    }
    ]
    
    
result_list = []    
result = {}
    
for item in products:
    for key,values in item.items():
        if isinstance(values,dict):
            for inner_key, inner_value in values.items():
                #remove me if you want all of the inner items to level-up
                if inner_key == "instock":
                    result[inner_key] = inner_value
        else:
            result[key] = values
            
    result_list.append(result)


print (result_list)
  

вывод:

 [{'color': 'blue', 'shape': 'square', 'instock': 'yes'}, {'color': 'blue', 'shape': 'square', 'instock': 'yes'}]
  

добавлен комментарий, чтобы уточнить, где изменить, если вы хотите, чтобы другой ключ также был повышен

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

1. Привет, это почти сработало — оно не включало первое (цвет: синий) против обоих (цвет: синий) и (цвет; красный) Я бы ожидал, что оба элемента будут обновлены.

2. это потому, что ключи в словаре уникальны. вставка каждого из них в качестве элемента списка решила эту проблему