Как я могу присоединить остальную часть поля к массиву после обработки группы, используя более одного ключа?

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