Як індексувати у словнику?


97

У мене є словник нижче:

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

Як індексувати перший запис у словнику?

colors[0]поверне a KeyErrorзі зрозумілих причин.


4
Що означає "перший"? Словники не мають замовлення.
S.Lott

2
Словники тепер вставки упорядкований оскільки Python 3.7 Перевірте це: stackoverflow.com/questions/39980323 / ...
Микита Alkhovik

Пов’язано: Ефективний
доступ

1
@ S.Lott Б'юсь об заклад, він би не запитав, якби знав, що вони невпорядковані :).
user7778287

Відповіді:


112

Словники не упорядковані у версіях 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.


2
У Python 2 використовуйте d.iterkeys().next()замість того, d.keys()[0]щоб перевіряти один із ключів, не виймаючи його. Якщо словник величезний, це матиме велике значення з точки зору продуктивності. Те саме стосується цінностей та предметів. У Python 2.7 ви також можете використовувати об'єкти перегляду dict
simleo

44
У Python 3 ці виклики повертають подання, а не фактичний список, тому вам слід обернути їх у виклик list (), інакше ви побачите: "Помилка TypeE: об'єкт" dict_values ​​"не підтримує індексацію". Дивіться цей SO питання: stackoverflow.com/questions/17431638 / ...
stifin

3
Просто гріха виправлення: ви не можете індексувати елементи (), принаймні не в Python 3.
Джон Стронг

1
Ця відповідь застаріла для python 3.6+, див. Відповідь @Pasha нижче.
hans

1
@hans Ця відповідь застаріла для Python 3.7, але не для Python 3.6, оскільки характер збереження порядку словників є деталлю реалізації реалізації CPython цієї версії Python, а не офіційною частиною мови. Відповідно оновлю цю відповідь.
Свен Марнах,

112

Якщо хтось все ще дивиться на це питання, прийнята в даний час відповідь застаріла:

Оскільки Python 3.7 *, словники зберігають порядок , тобто тепер вони поводяться точно так само, як collections.OrderedDictі раніше. На жаль, досі немає виділеного методу для індексування в 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

Звернення до елемента словника - це все одно, що сидіти на віслюку і насолоджуватися катанням.

Як правило, СЛОВНИК 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"}

Або будь-яка така комбінація.

Тож правило великого пальця - СЛОВНИК - це не впорядковано !


це дуже неважко ... мені це подобається!
Алекс Лю 33214,

2

Якщо вам потрібен замовлений словник, ви можете використовувати odict .


odict бачить, що не підтримує індексацію за ключами (), значеннями () або елементами ().
Костянтин

2

насправді я знайшов нове рішення, яке мені справді допомогло. Якщо вас особливо турбує індекс певного значення у списку або наборі даних, ви можете просто встановити значення словника на цей індекс !:

Просто дивись:

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

о, це важко. Тут ви маєте, в основному, два значення для кожного елемента. Тоді ви намагаєтесь зателефонувати їм із номером як ключем. На жаль, одне з ваших значень уже встановлено як ключ!

Спробуйте це:

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

Тепер ви можете викликати клавіші за номером так, ніби вони проіндексовані як список. Ви також можете вказати колір і номер за їх розташуванням у списку.

Наприклад,

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

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

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

colors_key = {'синій': 1, 'червоний': 6, 'yllow': 8}

Тоді ви зможете також шукати клавішу кольорів, якщо вам потрібно.

colors [colors_key ['blue']] [0] поверне "blue"

Щось таке.

І тоді, поки ви все робите, ви можете скласти дикт із числовими значеннями як ключами, щоб ви завжди могли використовувати їх для пошуку ваших кольорів, знаєте, якщо вам це потрібно.

значення = {5: [1, 'синій'], 6: [2, 'червоний'], 8: [3, 'жовтий']}

Потім, (кольори [кольори_клавіші [значення [5] [1]]] [0]) поверне "синій".

Або ви можете скористатися списком списків.

Удачі!


0

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


next(iter(d.items()))( .iteritems()у Python 2) також дає вам довільний елемент (те саме в моїх тестах, що має сенс, оскільки popitem може бути реалізований за допомогою цього), але не видалить елемент.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.