Как удалить дублирующиеся значения в списке словарей?

Есть список, который возвращается неким 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"

→ Ссылка