Как удалить дублирующиеся значения в списке словарей?
Есть список, который возвращается неким API-сервисом в таком виде:
l = [{'country': 'USA', 'state': 'Utah', 'town': 'Beaver'}, {'country': 'USA', 'state': 'Utah', 'town': 'Ogden'}, {'country': 'USA', 'state': 'Colorado', 'town': 'Denver'}, {'country': 'USA', 'state': 'Colorado', 'town': 'Salida'}, {'country': 'Brazil', 'state': 'Amazonas', 'town': 'Andarahy'}, {'country': 'Brazil', 'state': 'Amazonas', 'town': 'Tefe'}, {'country': 'Brazil', 'state': 'Roraima', 'town': 'Boa Vista'}, {'country': 'Brazil', 'state': 'Roraima', 'town': 'Ente-Rios'}]
Как удалить дублирующийся значения, чтобы по итогу вышел список такого вида:
l_1 = [{'country': 'USA', 'state': 'Utah', 'town': 'Beaver'}, { 'town': 'Ogden'}, {'country': 'USA', 'state': 'Colorado', 'town': 'Denver'}, {'town': 'Salida'}, {'country': 'Brazil', 'state': 'Amazonas', 'town': 'Andarahy'}, {town': 'Tefe'}, {'country': 'Brazil', 'state': 'Roraima', 'town': 'Boa Vista'}, {'town': 'Ente-Rios'}]
Буду рад любым советам.
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Немного странный желаемы результат. Не проще ли города из одной и той же провинции держать в виде списка в основном словаре?:
import pandas as pd
l = [{'country': 'USA', 'state': 'Utah', 'town': 'Beaver'}, {'country': 'USA', 'state': 'Utah', 'town': 'Ogden'}, {'country': 'USA', 'state': 'Colorado', 'town': 'Denver'}, {'country': 'USA', 'state': 'Colorado', 'town': 'Salida'}, {'country': 'Brazil', 'state': 'Amazonas', 'town': 'Andarahy'}, {'country': 'Brazil', 'state': 'Amazonas', 'town': 'Tefe'}, {'country': 'Brazil', 'state': 'Roraima', 'town': 'Boa Vista'}, {'country': 'Brazil', 'state': 'Roraima', 'town': 'Ente-Rios'}]
df=pd.DataFrame(l)
d = df.groupby(["country", "state"])["town"].apply(lambda x: list(x)).reset_index().to_dict(orient="records")
теперь d у вас:
[{'country': 'Brazil', 'state': 'Amazonas', 'town': ['Andarahy', 'Tefe']}, {'country': 'Brazil', 'state': 'Roraima', 'town': ['Boa Vista', 'Ente-Rios']}, {'country': 'USA', 'state': 'Colorado', 'town': ['Denver', 'Salida']}, {'country': 'USA', 'state': 'Utah', 'town': ['Beaver', 'Ogden']}]
Если нужно вот именно так, как вы написали, то добавляем такой цикл:
res = []
for i in d:
second = i["town"][1]
i["town"] = i["town"][0]
res.append(i)
res.append({"town":second})
теперь у вас в res:
[{'country': 'Brazil', 'state': 'Amazonas', 'town': 'Andarahy'}, {'town': 'Tefe'}, {'country': 'Brazil', 'state': 'Roraima', 'town': 'Boa Vista'}, {'town': 'Ente-Rios'}, {'country': 'USA', 'state': 'Colorado', 'town': 'Denver'}, {'town': 'Salida'}, {'country': 'USA', 'state': 'Utah', 'town': 'Beaver'}, {'town': 'Ogden'}]
Если остановиться на первом варианте, но учесть, что помимо поля "town" могут быть и другие, то сделать можно так:
d = df.groupby(["country", "state"])[["town", "code"]].apply(lambda x: x.to_dict(orient="records")).reset_index().to_dict(orient="records")
print(d)
получим d:
{'country': 'Brazil', 'state': 'Amazonas', 0: [{'town': 'Andarahy', 'code': 555}, {'town': 'Tefe', 'code': 666}]}, {'country': 'Brazil', 'state': 'Roraima', 0: [{'town': 'Boa Vista', 'code': 777}, {'town': 'Ente-Rios', 'code': 888}]}, {'country': 'USA', 'state': 'Colorado', 0: [{'town': 'Denver', 'code': 241}, {'town': 'Salida', 'code': 444}]}, {'country': 'USA', 'state': 'Utah', 0: [{'town': 'Beaver', 'code': 124}, {'town': 'Ogden', 'code': 144}]}]
где поля town и другие находятся в каждом словаре списка со своей страной и провинцией под индексом "0"