Слияние повторяющихся значений в списке словарей python
У меня есть список словарей в котором находятся эти данные:
dg = [{'patterns': 'знаю только понаслышке .','responses': 'а я слышал , и не раз .'},
{'patterns': 'знаю только понаслышке .', 'responses': 'зато я слышал .'},
{'patterns': 'знаю только понаслышке .', 'responses': 'оттуда видно всю долину .'},
{'patterns': 'знаю только понаслышке .', 'responses': 'я слышал , там многое изменилось .'}
{'patterns': 'ладно , повесь трубку .','responses': 'не могу .'},
{'patterns': 'ладно , повесь трубку .', 'responses': 'нет , звонить буду я .'},
{'patterns': 'ладно , повесь трубку .', 'responses': 'я звоню им .'},
{'patterns': 'ладно , повесь трубку .', 'responses': 'я не прекращу звонить .'}]
Что я только не делал, но все никак не удается пересобрать словарь так, чтобы повторяющиеся значения в 'patterns' были объединены, чтобы получился следующие вид:
dg = [{'patterns': 'знаю только понаслышке .', 'responses': ['а я слышал , и не раз .', 'зато я слышал .', 'оттуда видно всю долину .', ' я слышал , там многое изменилось .']},
{'patterns': 'ладно , повесь трубку .', 'responses': ['не могу .', 'нет , звонить буду я .', 'я звоню им .', 'я не прекращу звонить .']}
Что только не пробовал, все никак не выходит это реализовать.
Ответы (2 шт):
В словаре не может быть совпадающих ключей. Поэтому, то, что у Вас показано, это не словарь. Это даже синтаксически неверно. Это просто запись нескольких отдельных словарей в виде, который не является даже куском Python программы.
Похоже, Вас интересует слияние нескольких словарей, таким образом, что бы в поле значения присутсвовали списки значений. Эта задача обсуждалась много раз. например так и так
На мой взгляд, самое элегентное решение приведено тут
def mergeDict(dict1, dict2):
for k, v in dict2.items():
if dict1.get(k):
dict1[k] = [dict1[k], v]
else:
dict1[k] = v
return dict1
dict1 = {2: 'Samsung', 1: 'OnePlus', 4: 'Dell'}
dict2 = {3: 'ASUS', 5: 'LG', 4: 'Apple'}
dict3 = mergeDict(dict1, dict2)
print(dict3)
# {2: 'Samsung', 1: 'OnePlus', 4: ['Dell', 'Apple'], 3: 'ASUS', 5: 'LG'}
def group(list_):
values = set(map(lambda x: x["patterns"], list_))
res = [{"patterns": value, "responses": []} for value in values]
for dict_ in list_:
for i in range(len(res)):
if dict_["patterns"] == res[i]["patterns"]:
res[i]["responses"].append(dict_["responses"])
return res