Как мне нарезать OrderedDict?

#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]: вопросом, поэтому я придерживался самого близкого к этому в ответе.