2011-08-01 5 views
26

Можем ли мы узнать положение элементов в упорядоченном словаре Python? Например:Как узнать позицию элементов в упорядоченном словаре Python

Если у меня есть словарь:

// Ordered_dict is OrderedDictionary 

Ordered_dict = {"fruit": "banana", "drinks": "water", "animal": "cat"} 

Теперь, как знать, в каком положении кошка принадлежит? Можно ли получить ответ вроде:

position (Ordered_dict["animal"]) = 2 ? или каким-либо другим способом?

+7

Вы словарь не упорядоченный dict - это неупорядоченный простой Python dict. –

+8

Просто потому, что вы называете это заказываемым диктоном, это не делает его одним! – Jacob

ответ

49

Вы можете получить список ключей с keys собственности:

In [20]: d=OrderedDict((("fruit", "banana"), ("drinks", 'water'), ("animal", "cat"))) 

In [21]: d.keys().index('animal') 
Out[21]: 2 

Лучше производительность может быть достигнута с использованием iterkeys() хотя.

Для тех, кто использует Python 3

>>> list(x.keys()).index("c") 
1 
+23

'list (d.keys()). Index ('animal')' для всех, кто использует ** Python3 **, заканчивается здесь. – Torxed

+6

Кажется, что просто использование 'list (d) .index ('animal')' также работает в Python 3, если только я чего-то не упускаю. – Marein

+0

Для python 3 см. Https://stackoverflow.com/q/44147047/281545 –

3

Подумайте первое, что вам нужно, чтобы прочитать документацию. Если открыть учебник питона, а затем попытаться найти информацию о OrderedDict вы увидите следующее:

класс collections.OrderedDict ([элементы]) - Возвращает экземпляр ДИКТ подкласса, поддерживая обычные методы Dict. OrderedDict - это dict , который запоминает порядок ввода ключей. Если новая запись перезаписывает существующую запись, исходная позиция вставки остается без изменений. При удалении записи и повторной установке она переместит ее на конец .

Новое в версии 2.7.

Так что, если вы используете упорядоченный словарь, и вы не собираетесь удалять ключи, тогда «животное» всегда будет в положении, которое вы добавляете - например, Индекс 2.

Кроме того, чтобы получить индекс в «кошки» вы можете просто использовать:

from collections import OrderedDict 
d = OrderedDict((("fruit", "banana"), ("drinks", "water"), ("animal", "cat"))) 
d.keys() 
>>> ['fruit', 'drinks', 'animal'] 
d.values() 
>>> ['banana', 'water', 'cat'] 
# So 
d.values().index('cat') 
>>> 2 
2

Для Python3: tuple(d).index('animal')

Это почти так же, как ответ Marein в выше, но использует неизменяемый кортеж вместо измененного списка. Таким образом, он должен работать немного быстрее (~ 12% быстрее в моей быстрой проверке работоспособности).

+0

Обратите внимание, что это также работает в Python 2 (tuple (d) просто выполняет итерации по клавишам словаря и создает кортеж) –