Как проиндексировать в словарь? - PullRequest
66 голосов
/ 01 декабря 2010

У меня есть словарь ниже:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

Как мне проиндексировать первую запись в словаре?

colors[0] вернет KeyError по понятным причинам.

Ответы [ 7 ]

84 голосов
/ 01 декабря 2010

Словари не упорядочены в версиях Python до Python 3.6 включительно. Если вас не волнует порядок записей и вы хотите в любом случае получить доступ к ключам или значениям по индексу, вы можете использовать d.keys()[i] и d.values()[i] или d.items()[i]. (Обратите внимание, что эти методы создают список всех ключей, значений или элементов в Python 2.x. Поэтому, если они понадобятся вам более одного раза, сохраните список в переменной для повышения производительности.)

Если вам важен порядок записей, начиная с Python 2.7, вы можете использовать collections.OrderedDict. Или используйте список пар

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

если вам не нужен доступ по ключу. (Кстати, почему у вас строки чисел?)

В Python 3.7 упорядочены нормальные словари, поэтому вам не нужно больше использовать OrderedDict (но вы все равно можете - это в основном тот же тип). Реализация CPython в Python 3.6 уже включала это изменение, но поскольку оно не является частью спецификации языка, вы не можете положиться на него в Python 3.6.

60 голосов
/ 22 июня 2017

Если кто-то все еще смотрит на этот вопрос, принятый в настоящее время ответ устарел:

Начиная с Python 3.7 * словари сохраняют порядок , то есть теперь они ведут себя точно так же, как раньше collections.OrderedDict s. К сожалению, до сих пор нет специального метода для индексации в keys() / values() словаря, поэтому получение первого ключа / значения в словаре можно сделать как

first_key = list(colors)[0]
first_val = list(colors.values())[0]

или альтернативно (это позволяет избежать создания представления ключей в списке):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]

Если вам нужен n -й ключ, то аналогично

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 

(* CPython 3.6 уже включал упорядоченные дикты, но это была только деталь реализации. Спецификация языка включает упорядоченные дикты начиная с 3.7 и далее.)

3 голосов
/ 07 марта 2016

Обращаясь к элементу словаря, все равно что сидеть на осле и наслаждаться поездкой.

Как правило Python СЛОВАРЬ не имеет порядка

Еслиесть

dic = {1: "a", 2: "aa", 3: "aaa"}

Теперь предположим, что если я пойду как dic[10] = "b", тогда он не будет добавляться так всегда

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

Это может быть как

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

Или

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

Или

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

Или любая такая комбинация.

Таким образом, правило большого пальца равно СЛОВАРЬ равно без порядка !

2 голосов
/ 20 ноября 2014

На самом деле я нашел новое решение, которое действительно помогло мне. Если вас особенно беспокоит индекс определенного значения в списке или наборе данных, вы можете просто установить значение словаря для этого индекса !:

Просто смотри:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

Теперь с помощью хэш-карт вы можете извлекать ваши записи за постоянное время (намного быстрее)

1 голос
/ 19 октября 2018

о, это сложно. Здесь у вас есть два значения для каждого элемента. Затем вы пытаетесь позвонить им с номером в качестве ключа. К сожалению, одно из ваших значений уже установлено в качестве ключа!

Попробуйте это:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

Теперь вы можете вызывать ключи по номеру, как будто они проиндексированы как список. Вы также можете ссылаться на цвет и номер по их положению в списке.

Например,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

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

colors_key = {'blue': 1, 'red': 6, 'yllow': 8}

Затем вы также сможете найти клавишу с цветами, если вам нужно.

colors [colors_key ['blue']] [0] вернет 'blue'

Нечто подобное.

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

значения = {5: [1, «синий»], 6: [2, «красный»], 8: [3, «желтый»]}

Тогда (colors [colors_key [values ​​[5] [1]]] [0]) вернет 'blue'.

Или вы можете использовать список списков.

Удачи!

1 голос
/ 01 декабря 2010

Если вам нужен заказной словарь, вы можете использовать odict .

0 голосов
/ 01 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...