#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).