С данной информацией эта проблема является только неполной. Если то, что содержится в ключах Module
и Error
, хешируется (например, строки), их можно использовать в качестве ключа словаря. Вы можете создать промежуточный словарь с кортежем (Module, Error)
как уникальный ключ и проверить его существование. Если он не существует, сохраните словарь. Если он действительно существует, приращение Count
. Затем значения этого словаря будут содержать уникальные записи исходного списка с накопленными счетами.
def merge_and_sum_counts(list_of_dictionaries):
tupled_dictionary = {}
for d in list_of_dictionaries:
key = (d['Module'], d['Error'])
if key not in tupled_dictionary:
tupled_dictionary[key] = d
else:
tupled_dictionary[key]['Count'] += d['Count']
return tupled_dictionary.values()
Обратите внимание, что эта функция не заботится о том, что Time
остается в каждом словаре (так как вы не упоминать об этом). Пример использования приведен ниже.
list_of_dictionaries = [
{'Module': 'A', 'Error': 'A', 'Count': 5, 'Time': '22:34'},
{'Module': 'A', 'Error': 'A', 'Count': 3, 'Time': '21:33'},
{'Module': 'A', 'Error': 'B', 'Count': 2, 'Time': '15:31'},
{'Module': 'B', 'Error': 'A', 'Count': 1, 'Time': '07:59'},
{'Module': 'B', 'Error': 'A', 'Count': 7, 'Time': '10:45'},
{'Module': 'B', 'Error': 'B', 'Count': 9, 'Time': '15:45'},
]
print merge_and_sum_counts(list_of_dictionaries)
# [{'Count': 8, 'Time': '07:59', 'Module': 'B', 'Error': 'A'},
# {'Count': 2, 'Time': '15:31', 'Module': 'A', 'Error': 'B'},
# {'Count': 8, 'Time': '22:34', 'Module': 'A', 'Error': 'A'},
# {'Count': 9, 'Time': '15:45', 'Module': 'B', 'Error': 'B'}]
Также обратите внимание, что это помещает существующие словарные объекты в новый список. Смысл, словари в исходном списке будут обновлены после запуска этой функции. Чтобы этого избежать, вы можете изменить tupled_dictionary[key] = d
на tupled_dictionary[key] = d.copy()
.
Этот подход может также работать, если Module
и Error
не хешируются, потому что сами кортежи. Тем не менее, вы захотите убедиться, что Module1 == Module2
возвращает значение, которое вы ожидаете. Если Module
не переопределяет функцию класса по умолчанию, то равенство существует только до объекта id
. (Что может быть то, что вы хотите, трудно сказать.)
Вы достаточно хорошо описали свою цель. Что именно удерживает вас от вашей цели? что ты уже испробовал? Как это не удалось? –
также, когда вы отправляете фиктивные данные, постарайтесь сделать это в соответствии с вашими потребностями, потому что подсчет строк со значениями не является лучшим примером. –
Было бы неплохо включить пример вывода. В текущем вопросе мы не знаем, какое (если либо) время нужно сохранить. –