Необходимо удалить дубликаты ключей без удаления всего словаря - PullRequest
1 голос
/ 23 января 2020

Я хочу удалить дублированный ключ «Джон Доу» из словаря.

Словарь

info = [{"author": "John Doe", "book": {"title": "Getting started with Golang", "rating": 4.2, "category": "programming"}},
        {"author": "John Doe", "book": {"title": "Best practices with Reactjs", "rating": 4.4, "category": "front-end"}}]

Я хочу, чтобы результат выглядел примерно так:

test = {info[0]["author"]: [info[0]["book"], info[1]["book"]]}

Моя попытка, кроме этого, удаляет весь второй словарь.

aList = {}
final = []

for i in info:
    for values in i.values():
        if values not in aList.values():
            aListi["author"] = values

print(aList)

Помощь будет высоко ценится!

Ответы [ 4 ]

4 голосов
/ 23 января 2020

Это должно дать вам то, что вы хотите;

info = [{"author": "John Doe", "book": {"title": "Getting started with Golang", "rating": 4.2, "category": "programming"}},
        {"author": "John Doe", "book": {"title": "Best practices with Reactjs", "rating": 4.4, "category": "front-end"}}]

authors = {}

for entry in info:
    authors.setdefault(entry['author'], []).append(entry['book'])

print(authors)

# Output
{'John Doe': [{'title': 'Getting started with Golang', 'rating': 4.2, 'category': 'programming'}, {'title': 'Best practices with Reactjs', 'rating': 4.4, 'category': 'front-end'}]}

При этом используется setdefault , который просто инициализирует указанный ключ c, в данном случае ваше имя автора и append элемент в список.

2 голосов
/ 23 января 2020

Попробуйте использовать groupby :

print({k: [book["book"] for book in g] for k, g in groupby(info, lambda x: x["author"])})

Вывод:

{'John Doe': [{'title': 'Начало работы с Golang ',' category ':' программирование ',' rating ': 4.2}, {' title ':' Лучшие практики с Reactjs ',' category ':' front-end ',' rating ': 4.4} ]}

1 голос
/ 23 января 2020

Вы можете использовать itertools.groupby, а для получения ключа я предлагаю использовать operator.itemgetter

from itertools import groupby
from operator import itemgetter

info = [{"author": "John Doe", "book": {"title": "Getting started with Golang", "rating": 4.2, "category": "programming"}},
        {"author": "John Doe", "book": {"title": "Best practices with Reactjs", "rating": 4.4, "category": "front-end"}}]

result = {k: [d['book'] for d in g] for k, g in groupby(info, itemgetter('author'))}

{'John Doe': [{'title': 'Getting startedwith Golang', 'rating': 4.2, 'category':'programming'},
              {'title': 'Best practices with Reactjs', 'rating': 4.4, 'category': 'front-end'}]}
1 голос
/ 23 января 2020

Вы можете попробовать это:

new_dict = pd.DataFrame(info).groupby(['author'])['book'].\
           apply(lambda x : x.tolist()).\
           to_dict()

new_dict

{'John Doe': [{'title': 'Getting started with Golang',
   'rating': 4.2,
   'category': 'programming'},
  {'title': 'Best practices with Reactjs',
   'rating': 4.4,
   'category': 'front-end'}]}
...