У меня есть такой список словарей на питоне
[
{
"compania": "Fiat",
"modelo": "2014",
"precio": "1000"
},
{
"compania": "Renault",
"modelo": "2014",
"precio": "2000"
},
{
"compania": "Volkwagen",
"modelo": "2014",
"precio": "3000"
},
{
"compania": "Chevrolet",
"modelo": "2014",
"precio": "1000"
},
{
"compania": "Peugeot",
"modelo": "2014",
"precio": "2000"
}
]
Что я хотел бы преобразовать в такой список списка словарей
{
"Fiat": {
"modelo": "2014",
"precio": "1000"
},
"Renault": {
"modelo": "2014",
"precio": "2000"
},
"Volkwagen": {
"modelo": "2014",
"precio": "3000"
},
"Chevrolet": {
"modelo": "2014",
"precio": "1000"
},
"Peugeot": {
"modelo": "2014",
"precio": "2000"
}
}
Так что ты пробовал? Это кажется довольно простым: просто вытащите d['compania'] из каждого элемента списка и создайте словарь с ним, а остальные пары ключ-значение будут его содержимым.
Да, я очень новичок в этих проблемах. Спасибо






Вы можете создать словарь, перебирая элементы исходного списка. Предполагая, что ваш список называется car_list:
d = { x["compania"]: {"modelo": x["modelo"], "precio": x["precio"] } for x in car_list }
Спасибо, я работаю, есть книга или статья, посвященная этим вопросам, я новичок.
Мы можем использовать понимание слов
{a.get('compania'): {k: v for k, v in a.items() if k != 'compania'} for a in c}
{'Fiat': {'modelo': '2014', 'precio': '1000'},
'Renault': {'modelo': '2014', 'precio': '2000'},
'Volkwagen': {'modelo': '2014', 'precio': '3000'},
'Chevrolet': {'modelo': '2014', 'precio': '1000'},
'Peugeot': {'modelo': '2014', 'precio': '2000'}}
где c - ваши исходные данные
Предполагая, что ваш список называется l, вы можете сделать это, используя простую итерацию и построив новый словарь d:
d = {}
for sub in l:
d[sub.pop('compania')] = sub
Это дает в словаре d:
{'Chevrolet': {'modelo': '2014', 'precio': '1000'},
'Fiat': {'modelo': '2014', 'precio': '1000'},
'Peugeot': {'modelo': '2014', 'precio': '2000'},
'Renault': {'modelo': '2014', 'precio': '2000'},
'Volkwagen': {'modelo': '2014', 'precio': '3000'}}
Объяснение: Для каждого словаря в этом списке (sub): sub.pop('compania') удаляет запись ключа compania в sub и возвращает соответствующее значение. Затем мы обновляем словарь d, чтобы он имел ключ только что возвращенного, и мы связываем с этим ключом остаток от sub после удаления этой записи.
Зачем вам здесь использовать деструктивные операции вроде .pop? Есть ли преимущество? В общем, если вы не пытаетесь что-то удалить, я бы ошибся на стороне удаления нет.
@ juanpa.arrivillaga просто потому, что pop кратко возвращает ключ, который мы хотим для нового словаря, и после его выполнения оставляет после себя то, каким должно быть значение, связанное с этим ключом. Я все же понимаю, откуда вы идете :)
с функцией сопоставления для возврата нового настраиваемого списка словаря
a=[
{
"compania": "Fiat",
"modelo": "2014",
"precio": "1000"
},
{
"compania": "Renault",
"modelo": "2014",
"precio": "2000"
},
{
"compania": "Volkwagen",
"modelo": "2014",
"precio": "3000"
},
{
"compania": "Chevrolet",
"modelo": "2014",
"precio": "1000"
},
{
"compania": "Peugeot",
"modelo": "2014",
"precio": "2000"
}
]
def mapper(temp): # define a mapper
new_temp = {}
new_temp[temp['compania']] = {k:v for k,v in temp.items() if k!='compania'}
return new_temp
map(mapper,a) # call map function with mapper and list as argument
result = {}
for d in l:
# Store the value of the key 'compania' before popping it from the small dictionary d
compania = d['compania']
d.pop('compania')
# Construct new dictionary with key of the compania and value of the small dictionary without the compania key/value pair
result[compania] = d
print(result)
Вывод:
{'Chevrolet': {'modelo': '2014', 'precio': '1000'},
'Fiat': {'modelo': '2014', 'precio': '1000'},
'Peugeot': {'modelo': '2014', 'precio': '2000'},
'Renault': {'modelo': '2014', 'precio': '2000'},
'Volkwagen': {'modelo': '2014', 'precio': '3000'}}
Поделюсь простым решением:
>>> {d.pop("compania"):d for d in dd}
не используйте .pop в конструкции понимания, это имеет побочный эффект, и вам следует избегать побочных эффектов в функциональных конструкциях.
Именно потому, что решение использует побочный эффект, в данном конкретном случае оно кратковременное.
Вы можете просто использовать словарь Обновить, который затем может создать новый словарь по вашему выбору.
from pprint import PrettyPrinter as pp
d = {}
for i in l: # 'l' represents your list of dictionary
d.update({i['compania']:{"modelo":i['modelo'],"precio":i['precio']}})
print(pp(indent=4).pprint(d))
ouput:
{ 'Chevrolet': {'modelo': '2014', 'precio': '1000'},
'Fiat': {'modelo': '2014', 'precio': '1000'},
'Peugeot': {'modelo': '2014', 'precio': '2000'},
'Renault': {'modelo': '2014', 'precio': '2000'},
'Volkwagen': {'modelo': '2014', 'precio': '3000'}}
Что вы пробовали, и в чем именно проблема? Также обратите внимание, что ваш вывод представляет собой словарь, отображающий строки в словари, а не список списков словарей.