2013-02-27 5 views
17

Я хотел бы получить значение по индексу ключа из словаря Python. Есть ли способ получить что-то вроде этого?Доступ к значению словаря по индексу в python

dic = {} 
value_at_index = dic.ElementAt(index) 

где index представляет собой целое число

P.S. Задаваемый вопрос означает отсутствие какого-либо понимания, особенно если это новый язык, и для чего это нужно, друзья? :( ElementAt широко используются в C# Linq

+0

Для более поздних посетителей этого поста: Получения значения по индексу: 'dic.values ​​() [индекс]' Получения ключа по индексу: 'DIC .keys() [index] ' –

+0

Возможный дубликат [Как индексировать словарь?] (https://stackoverflow.com/questions/4326658/how-to-index-into-a-dictionary) –

ответ

17

Стандартного Python словарей по своей сути неупорядоченный, так что вы просите, чтобы сделать это на самом деле не имеет смысла.

Если вы действительно, действительно знаете, что вы делать, используйте

value_at_index = dic.values()[index] 

Имейте в виду, что добавление или удаление элемента потенциально может изменить индекс любого другого элемента.

+5

Хотя' OrderedDict 'доступно, если у вас есть возможность изменить исходную структуру данных. –

+0

>> что добавление или удаление элемента может потенциально изменить индекс каждого другого элемента. Да, я знаю это, это здравый смысл для многих итераторов на многих языках. – Dmitry

+0

Да, для чего я хочу индекс, это получить случайные значения в пределах доступного диапазона ключей, просто чтобы реализовать мой алгоритм. – Dmitry

2

Если вы действительно хотите просто случайное значение из диапазона клавиш, то используйте random.choice на значения словаря (преобразуется в форму списка, если Python 3).

>>> from random import choice 
>>> d = {1: 'a', 2: 'b', 3: 'c'} 
>>>> choice(list(d.values())) 
+0

Хороший совет, спасибо! – Dmitry

2

В то время как вы можете сделать

value = d.values()[index] 

Он должен быть быстрее, чтобы сделать

value = next(v for i, v in enumerate(d.itervalues()) if i == index) 

редактировать: Я просто засек с помощью Dict из Len 100000000 проверки для индекса на очень end, а версия 1st/values ​​() заняла 169 секунд, а вторая/следующая() - 32 секунды.

Кроме того, обратите внимание, что это предполагает, что ваш индекс не является отрицательным

Смежные вопросы