Существует ли встроенный эффективный способ создания диктанта диктов из списка диктов с учетом уникального идентификатора в каждом дикте, который используется в качестве ключа в python?

#python-3.x #list #dictionary #transformation #built-in

#python-3.x #Список #словарь #преобразование #встроенный

Вопрос:

Я просто хотел знать, существует ли встроенный более эффективный способ сопоставления списка очень разных словарей, которые имеют одинаковые ключи, но разные значения, и одно из значений ключей уникально между ними, со словарем словарей, где это уникальное значение является ключом?

Например, учитывая:

 example_list = [  {  'id': 32,  'value1': 'something',  'value2': False,  'value3': 134.43,  'value4': [123, 431]  },  {  'id': 4,  'value1': 'something else',  'value2': True,  'value3': 678.43,  'value4': [126, 433]  },  {  'id': 323,  'value1': 'something something',  'value2': False,  'value3': 0.0,  'value4': [43, 12]  }  ] desired_result = {  32: {  'id': 32,  'value1': 'something',  'value2': False,  'value3': 134.43,  'value4': [123, 431]  },  4: {  'id': 4,  'value1': 'something else',  'value2': True,  'value3': 678.43,  'value4': [126, 433]  },  323: {  'id': 323,  'value1': 'something something',  'value2': False,  'value3': 0.0,  'value4': [43, 12]  }  }   

Я знаю, что это можно заархивировать различными способами, такими как:

 def list_of_dicts_to_dict_of_dicts_by_map(key, data_list):  def dict_to_key_tuple(data):  return data[key], data  return dict(map(dict_to_key_tuple, data_list))  def list_of_dicts_to_dict_of_dicts_by_comprehension(key, data_list):  return {d[key]: d for d in data_list}  def list_of_dicts_to_dict_of_dicts_by_forloop(key, data_list):  res = dict()  for item in data_list:  res[item[key]] = item  return res  

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

Но… есть ли более питонический и эффективный способ сделать это, чем эти?

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

The third is the one I like the most, it is quicker and is very easy to understand what it does from a glance, but as it is multiple if you really want to use it a lot of times you have to end up writing the function in a file and importing it everywhere or pasting the function on each file you want to use it.

Aren’t there some good built-in functions to do this transformation in the default library? i really like stuff like map(itemgetter(‘id’), list_of_dicts) to map all the values of a single key of a list of dicts to a plain list.

Разве нет чего-то стандартного для такого рода операций? Я чувствую, что упускаю что-то довольно очевидное, имеющее конкретное название, и я просто не могу его найти, потому что не знаю, какое имя искать, в конце концов, я чувствую, что эта трансформация должна быть довольно стандартной… Я использую его все время, особенно при работе с реляционными данными из базы данных,если у вас есть диктант с ключом, представляющим идентификатор отношения, вы можете легко получить значение, чтобы у вас были другие табличные данные в этом формате, выполнив dict_of_partners.get(sale_object[‘partner_id’], False).