#python #python-3.x #slice #ordereddict
#питон #python-3.x #нарезать #предписанный запрет
Вопрос:
Я попробовал нарезать OrderedDict следующим образом:
for key in some_dict[:10]:
Но я получаю ошибку TypeError, в которой говорится: «unhashable type: ‘slice'». Как мне получить первые 10 пар ключ-значение этого словаря?
Комментарии:
1.
dict
объекты не могут быть нарезаны
Ответ №1:
Попробуйте преобразовать OrderedDict
во что-то, что можно нарезать:
list_dict = list(some_dict.items())
for i in list_dict[:10]:
# do something
Теперь каждая пара ключ-значение представляет собой кортеж из двух элементов. (индекс 0 — это ключ, индекс 1 — значение)
Ответ №2:
OrderedDict предназначен только для поддержания порядка, а не для обеспечения эффективного поиска по позиции в этом порядке. (Внутренне они поддерживают порядок с помощью двусвязного списка.) OrderedDicts не могут обеспечить эффективную нарезку в общем случае, поэтому они не реализуют нарезку.
Для вашего варианта использования вы можете вместо этого использовать itertools
для остановки цикла после 10 элементов:
import itertools
for key in itertools.islice(your_odict, 0, 10):
...
или
for key, value in itertools.islice(your_odict.items(), 0, 10):
...
Внутренне, islice
просто прекратит выборку элементов из базового итератора OrderedDict, как только он достигнет 10-го элемента. Обратите внимание, что, хотя вы можете указать islice
использовать значение шага или ненулевое начальное значение, он не может сделать это эффективно — ему придется извлекать и отбрасывать все значения, которые вы хотите пропустить, чтобы перейти к тем, которые вас интересуют.
Комментарии:
1. Поскольку OP хочет «пары ключ-значение», не так ли
itertools.islice(your_odict.items(), 0, 10)
?2. @martineau: На самом деле это не имеет значения. Вы можете проиндексировать dict, чтобы получить значения. Они пошли с
for key in some_dict[:10]:
вопросом, поэтому я придерживался самого близкого к этому в ответе.