2013-06-07 2 views
5

Учитывая словарь python и целое число n, мне нужно получить доступ к n-му ключу. Мне нужно делать это много раз в моем проекте.Извлечь n-й ключ в словаре python?

Я написал функцию, которая делает это:

def ix(self,dict,n): 
    count=0 
    for i in sorted(dict.keys()): 
     if n==count: 
      return i 
     else: 
      count+=1 

Но проблема в том, что если в словаре огромен, временная сложность возрастает, когда используется повторно.

Есть ли эффективный способ сделать это?

+0

Во-первых, удалите '.keys()' для эквивалентного, но более быстрый код – jamylak

+13

нет ничего подобного «n-ый элемент» в неупорядоченной коллекции. вы неправильно формулируете проблему. – Elazar

+0

@jamylak Я, спасибо! Я не знал, что итерация может быть выполнена даже без .keys(), и есть ли решение для основного вопроса? –

ответ

7

Я предполагаю, что вы хотели сделать что-то подобное, но в словаре не имеют никакого порядка, так что порядок ключей в dic.keys может быть что угодно:

def ix(self, dic, n): #don't use dict as a variable name 
    try: 
     return list(dic)[n] # or sorted(dic)[n] if you want the keys to be sorted 
    except IndexError: 
     print 'not enough keys' 
+0

'list (dic)' работает просто отлично –

+0

Спасибо @Ashwini, поэтому внутренний python создает список со всеми ключами в словаре rite? –

+0

@HemanthMalla Нет, python dicts реализованы как хэш-таблицы. http://docs.python.org/2/faq/design.html#how-are-dictionaries-implemented –

0

Словарь - это неупорядоченная коллекция. Итак, нет 1-го, 2-го или n-го элементов.

+0

Вы несколько раз пытались напечатать один диктофон? это один и тот же порядок каждый раз, если вы не меняете его между ними. – Elazar

+1

Нет, печать одного и того же dict (без изменений) не изменяет порядок. –

+0

yes correct, Thanks – sinhayash

6

dict.keys() возвращает список так, все, что вам нужно сделать это dict.keys()[n]

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

+0

это итерируемый в python3. – Elazar

+0

oops ... Мне действительно нужно обновить, это моя вторая коррекция python3 за день :) – shyam

+2

На самом деле '' 'list (dict.keys()) [0]' '' работал. – raratiru

1

dict.keys() возвращает список, который означает, что вы можете использовать массив индексы для доступа к элементу.

def ix(self, dict, n): 
    if len(dict.keys()) > n: 
     return dict.keys()[n] 
    else: 
     //NOT ENOUGH ELEMENTS 
+1

На самом деле '' 'list (dict.keys()) [n]' '' работал – raratiru

-1

Это, как я извлекаю 2-го значения для каждого ключа словаря:

{key: gaGdT[key][1] for key in parSet} 

gaGdT является словарь источник с значениями, хранящимися в виде кортежа. parSet - набор уникальных словарных клавиш.

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