#python #dictionary #grouping
#питон #словарь #группировка
Вопрос:
Я хочу загрузить данные в «dict_array» и создать группу на основе ключей » a » и «b», а остальные ключи и значения поместить в массив. Вынужден сравнивать ключ и значение с циклом for и обрабатывать его, но это слишком медленно. Есть ли способ быстро позаботиться об этом?
- оригинал
dict_array=[ {'a':1,'b':1,'c':11,'d':21}, {'a':1,'b':1,'c':12,'d':22}, {'a':1,'b':1,'c':13,'d':23} ]
- сгруппированы
dict={ 'a':1, 'b':1, 'array':[ {'c':11,'d':21}, {'c':12,'d':22}, {'c':13,'d':23} ] }
- пример функции
def dict_search_in_array(dict_array,search_dict): idx=0 for dict in dict_array: if dict['a'] == search_dict['a'] and dict['b'] == search_dict['b'] : return True,idx idx=idx 1 return False,-1 def dict_bucket(dict_array,add_dict): is_bucketed,idx = dict_search_in_array(dict_array,add_dict) if is_bucketed : # TODO : append array print('Bucketed :',idx) else: # TODO : add dict print('Not Bucketed')
Ответ №1:
Я не знаю, будет ли это быстрее, но вы можете использовать наборы для поиска пересечений и различий между списками, без необходимости зацикливаться и проводить собственные сравнения:
dict_array=[ {'a':1,'b':1,'c':11,'d':21}, {'a':1,'b':1,'c':12,'d':22}, {'a':1,'b':1,'c':13,'d':23} ] # Convert each dict in dict_array into a set sets_array = [set(x.items()) for x in dict_array] # Find the intersection of all sets intersect = set.intersection(*sets_array) # {('b', 1), ('a', 1)} # Find the differences between each set in the array and the intersection diff_array = [set.difference(x, intersect) for x in sets_array] # Convert the array of sets back to an array of dicts new_dict = {'array': [dict(x) for x in diff_array]} # Add on the intersection set as a dict new_dict.update(intersect) print(new_dict) # {'array': [{'d': 21, 'c': 11}, {'c': 12, 'd': 22}, {'c': 13, 'd': 23}], 'b': 1, 'a': 1}