Для каждого значения в списке словарей выведите соответствующее значение в python - PullRequest
0 голосов
/ 16 января 2020

У меня есть список словарей, и я хочу сделать для каждого из них, чтобы найти соответствующие значения.

Мой список:

my_list = [{'genre':'Dystopia', 'book':'Hunger Games'},
           {'genre':'Fanstasy', 'book':'Harry Potter'},
           {'genre':'Dystopia', 'book':'Divergent'}]

Я хочу получить книги, соответствующие жанру.

Ожидаемый результат:

for 'Dystopia' get 'Hunger Games', 'Divergent'
for 'Fantasy' get 'Harry Potter'

Я не уверен, как go об этом. Я знаю, что мне нужно для l oop, но не знаю, что делать дальше.

for x in my_list:
   x['url']

Не уверен, что добавить дальше.

Ответы [ 6 ]

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

Попробуйте это.

[dictionary['book'] for dictionary in my_list if dictionary['genre'] == 'Dystopia']

Это проходит через все словари в my_list, и если genre равно Dystopia, то записывается book.

ниже показывает, как получить словарь, содержащий все книги для каждого жанра.

genres = set([dictionary['genre'] for dictionary in my_list])
result = {genre:[dictionary['book'] for dictionary in my_list if dictionary['genre'] == genre] for genre in genres}
0 голосов
/ 16 января 2020

Из этого ответа , вы можете попытаться создать новый класс из встроенного dict:

class Dictlist(dict):
    def __setitem__(self, key, value):
        try:
            self[key]
        except KeyError:
            super(Dictlist, self).__setitem__(key, [])
        self[key].append(value)

Итак ...

d = Dictlist()
for element in my_list:
    d[element['genre']] = d['book']

вывод:

{'Dystopia': ['Hunger Games', 'Divergent'], 'Fanstasy': ['Harry Potter']}
0 голосов
/ 16 января 2020

Вы можете сделать что-то вроде этого:

books={}
for i in my_list:
    genre=i["genre"]
    book=i["book"]
    if genre in books:
        if book in books[genre]:
            continue
    else:
        books[genre]=[]
    books[genre].append(book)

print(books)

output

{'Dystopia': ['Hunger Games', 'Divergent'], 'Fanstasy': ['Harry Potter']}
0 голосов
/ 16 января 2020

Для более функционального подхода возвращаем карту правильных книг:

list(map(lambda x: x["book"], filter(lambda x: x["genre"] == "Dystopia", my_list)))
>>> ['Hunger Games', 'Divergent']
0 голосов
/ 16 января 2020

Привет, пожалуйста, найдите решение ниже.

my_list = [
{'genre':'Dystopia', 'book':'Hunger Games'},
           {'genre':'Fanstasy', 'book':'Harry Potter'},
           {'genre':'Dystopia', 'book':'Divergent'}
           ]
genre_holder = dict()
for item in my_list:
    if genre_holder.get(item['genre'],"empty") == "empty":
         genre_holder[item['genre']] = list()
    genre_holder[item['genre']].append(item['book'])
print(genre_holder)

for genre in genre_holder:
    print("for ",genre," get ", ",".join(genre_holder[genre]))
0 голосов
/ 16 января 2020

вы хотите получить словарь жанра -> список книг,

, поэтому вам нужно перебрать my_list, взять жанр (как ключ) и книгу (как значение) и добавить это к списку книг в этом жанре

с использованием defaultdict легко исключит угловой регистр первой книги.

from collections import defaultdict

result = defaultdict(list)
for d in my_list:
  result[d['genre']].append(d['book'])
...