Как получить первые 3 элемента в Python OrderedDict?

Как получить первые 3 элемента в Python OrderedDict?

Также возможно удалить данные из этого словаря.

Например: как мне получить первые 3 элемента в Python OrderedDict и удалить остальные элементы?


person Michael Smith    schedule 15.05.2015    source источник


Ответы (3)


Давайте создадим простой OrderedDict:

>>> from collections import OrderedDict
>>> od = OrderedDict(enumerate("abcdefg"))
>>> od
OrderedDict([(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')])

Чтобы вернуть первые три ключа, значения или элементы соответственно:

>>> list(od)[:3]
[0, 1, 2]
>>> list(od.values())[:3]
['a', 'b', 'c']
>>> list(od.items())[:3]
[(0, 'a'), (1, 'b'), (2, 'c')]

Чтобы удалить все, кроме первых трех элементов:

>>> while len(od) > 3:
...     od.popitem()
... 
(6, 'g')
(5, 'f')
(4, 'e')
(3, 'd')
>>> od
OrderedDict([(0, 'a'), (1, 'b'), (2, 'c')])
person Zero Piraeus    schedule 15.05.2015
comment
.items() и .values() возвращают списки (по крайней мере, в Python 2.7), поэтому нет необходимости использовать list(). Отличается ли это в Python 3? - person John; 15.05.2015
comment
@John Да. Я решил не усложнять ответ, упомянув, что в версии 2.x возвращаются списки: здесь нет никакого практического значения, и в любом случае теперь все должны писать с учетом версии 3.x (даже если их код еще не ориентируйтесь на него). - person Zero Piraeus; 15.05.2015
comment
Стоит отметить, что OrderedDict(list(od.items())[:3]) вернет словарь только с первыми тремя элементами в одной строке. - person cjbarth; 22.02.2018

Вы можете использовать этот итеративный метод для выполнения работы.

x = 0
for i in ordered_dict:
    if x > 3:
        del ordered_dict[i]
    x += 1

Сначала вы просто создаете переменную-счетчик x и присваиваете ей значение 0. Затем вы циклически перебираете ключи в ordered_dict. Вы видите, сколько элементов было проверено, увидев, что x больше 3, что является количеством значений, которые вам нужны. Если 3 элемента уже были проверены, вы delберете этот элемент из ordered_dict.


Вот более чистый альтернативный метод (спасибо комментариям)

for i, k in enumerate(ordered_dict):
    if i > 2:
        del ordered_dict[k]

Это работает, используя enumerate для присвоения номера каждой клавише. Затем он проверяет, меньше ли это число двух (0, 1 или 2). Если число не равно 0, 1 или 2 (это будут первые три элемента), то этот элемент в словаре будет удален.

person michaelpri    schedule 15.05.2015
comment
А, я вижу, к чему ты клонишь. Виноват. Вместо этого вы можете использовать enumerate. - person kindall; 15.05.2015
comment
Нвм, но да, лучше перечислить. - person Shashank; 15.05.2015
comment
Что-то вроде этого: for i, k in enumerate(odct): if i > 2: del odct[k] Очевидно, не в одной строке, потому что это синтаксическая ошибка :p - person Shashank; 15.05.2015
comment
Обратите внимание, что это решение не работает для python3 с n RuntimeError, поскольку размер словаря не может изменяться во время итерации. - person mutableVoid; 13.04.2021

Это не отличается от других диктов:

d = OrderedDict({ x: x for x in range(10) })

i = d.iteritems()
a = next(i)
b = next(i)
c = next(i)

d = OrderedDict([a,b,c])
# or
d.clear()
d.update([a,b,c])
person kay    schedule 15.05.2015