Странная ошибка при попытке конвертировать слайс-объект в словарь - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь получить первые K элементов из словаря. Мой код приведен ниже.

 d= dict([(1, 2.0), (2, 0.0), (3, 3.0), (4, 0.0), (5, 4.0), (6, 0.0), (7, 0.0), (8, 0.0), (9, 0.0), (10, 3.0), (11, 3.0), (12, 2.0), (13, 0.0), (14, 0.0), (15, 0.0), (16, 0.0), (17, 0.0), (18, 0.0)])
 d
{1: 2.0, 2: 0.0, 3: 3.0, 4: 0.0, 5: 4.0, 6: 0.0, 7: 0.0, 8: 0.0, 9: 0.0, 10: 3.0, 11: 3.0, 12: 2.0, 13: 0.0, 14: 0.0, 15: 0.0, 16: 0.0, 17: 0.0, 18: 0.0}
 dict(islice({k:v for k,v in sorted(d.items(), key=lambda item : item[1], reverse=True)},5))

Traceback (последний вызов был последним): файл "", строка 1, в TypeError: невозможно преобразовать элемент последовательности обновления словаря # 0 в последовательность

Мне трудно понять, что пошло не так. Поскольку подобный код работает без проблем

 dd
{'d': 4, 'c': 3, 'b': 2, 'a': 1}
 dict(islice(dd.items(),2))
{'d': 4, 'c': 3}

1 Ответ

1 голос
/ 11 апреля 2020

islice обрабатывает свой первый аргумент как итератор. Когда вы перебираете словарь, вы перебираете только ключи, а не значения:

d = {'a': 1, 'b':2, 'c':3}
print(list(islice(d, 1)))  # ['a']

Так что вам просто нужно удалить словарное понимание около sorted, так как элементы, которые он производит, могут быть использованы dict создать новый словарь

dict(islice(sorted(d.items(), key=lambda item : item[1], reverse=True),5))
# {5: 4.0, 3: 3.0, 10: 3.0, 11: 3.0, 1: 2.0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...