Расшифруйте список словарей

У меня есть такой список словарей на питоне

[
  {
    "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"
  }  
}

Что вы пробовали, и в чем именно проблема? Также обратите внимание, что ваш вывод представляет собой словарь, отображающий строки в словари, а не список списков словарей.

jonrsharpe 03.01.2019 20:20

Так что ты пробовал? Это кажется довольно простым: просто вытащите d['compania'] из каждого элемента списка и создайте словарь с ним, а остальные пары ключ-значение будут его содержимым.

ycx 03.01.2019 20:21

Да, я очень новичок в этих проблемах. Спасибо

Gary Becker 03.01.2019 20:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
111
7

Ответы 7

Вы можете создать словарь, перебирая элементы исходного списка. Предполагая, что ваш список называется car_list:

d = { x["compania"]: {"modelo": x["modelo"], "precio": x["precio"] } for x in car_list }

Спасибо, я работаю, есть книга или статья, посвященная этим вопросам, я новичок.

Gary Becker 03.01.2019 20:30

Мы можем использовать понимание слов

{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 03.01.2019 20:38

@ juanpa.arrivillaga просто потому, что pop кратко возвращает ключ, который мы хотим для нового словаря, и после его выполнения оставляет после себя то, каким должно быть значение, связанное с этим ключом. Я все же понимаю, откуда вы идете :)

user10859576 03.01.2019 20:43

с функцией сопоставления для возврата нового настраиваемого списка словаря

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 в конструкции понимания, это имеет побочный эффект, и вам следует избегать побочных эффектов в функциональных конструкциях.

juanpa.arrivillaga 03.01.2019 20:39

Именно потому, что решение использует побочный эффект, в данном конкретном случае оно кратковременное.

intellimath 03.01.2019 20:55

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

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'}}

Другие вопросы по теме