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


203

Я намагаюся отримати свою програму для друку "banana"зі словника. Який був би найпростіший спосіб зробити це?

Це мій словник:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
Словники в Python не упорядковані, тому "першого ключа" немає. Дивіться тут
Девід Робінсон

2
Ви хочете надрукувати буквально слово "банан" або значення, пов'язане з "банан" (у даному випадку 4)?
Пол H

to print out banana with a FOR loop, so when I run it, each key would also be printed outВи маєте на увазі for k in prices: print k? Це дозволить роздрукувати всі ключі в словнику.
Девід Робінсон


8
на перший коментар: в пітона замовленого dictionariesare 3.6 + (див stackoverflow.com/questions/39980323 / ... )
Egirus Ornila

Відповіді:


289

У версії Python, де насправді впорядковані дикти, ви можете це зробити

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

Для того, щоб замовляти дикти, вам потрібен Python 3.7+ або 3.6+, якщо ви добре покладаєтесь на упорядкований технічно-втілення-деталізація характер диктів на Python 3.6.

Для більш ранніх версій Python "першого ключа" немає.


31
Якщо ви хочете і ключ, і значення в Python 3:next(iter( my_dict.items() ))
Jonathan H

@RyanHaining Python дикти впорядковуються вставкою, починаючи з CPython 3.6 і будь-якою іншою реалізацією Python, починаючи з Python 3.7
Борис

1
ця відповідь накрутила мою сесію налагодження, що я чекав 6 годин, щоб дістатися до точки перерви. Це дуже вражаюче.
Михайло

133

Словник не індексується, але він певним чином упорядкований. Нижче подано перший наявний ключ:

list(my_dict.keys())[0]

26
Хіба це не буде простіше просто поставити, list(my_dict)[0]оскільки він все одно отримає список ключів?
Жан-Франсуа Т.

@ Жан-ФрансуаT. так
Райан Хайнінг

Словники тепер упорядковані в CPython 3.6 та всі інші реалізації Python, починаючи з Python 3.7
Борис

53

Оновлення: станом на Python 3.7 порядок вставки підтримується, тому тут вам не потрібно OrderedDict. Наведені нижче підходи можна використовувати із звичайнимdict

Змінено у версії 3.7: Порядок словника гарантується порядком вставки. Така поведінка була детальною інформацією про реалізацію CPython від 3.6.

джерело


Python 3.6 і новіші *

Якщо ви говорите про звичайний dict, то "перший ключ" нічого не означає. Клавіші не упорядковані жодним чином, від якого ви можете залежати. Якщо ви повторите свій шлях, dictви, швидше за все, не отримаєте "banana"як перше, що бачите.

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

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

Якщо ви хотіли побачити всі ключі, щоб ви могли це зробити, повторивши через нього

for k in prices:
    print(k)

Ви також можете ввести всі ключі до списку, а потім працювати з цим

ks = list(prices)
print(ks[0]) # will print "banana"

Більш швидким способом отримати перший елемент без створення списку було б викликати nextітератор. Це не гарно узагальнює при спробі отримати nthелемент

>>> next(iter(prices))
'banana'

* CPython мав гарантований порядок вставки як деталі реалізації в 3.6.


Дякую за пораду. Мені шкода, що не ясніше. Я просто намагаюся знайти код, який дозволить мені роздрукувати "Banana" НЕ значення, пов'язане з ним. Дякую за весь внесок!
слагой

33

Для Python 3 нижче усуває накладні перетворення списку:

first = next(iter(prices.values()))

10

dictТип являє собою невпорядковане відображення, так що не існує такого поняття , як «перший» елемент.

Те, що ти хочеш, мабуть collections.OrderedDict.


або з названим набором, можливо, якщо воно незмінне
Джоран Біслі,

Це змінилося станом на Python 3.6. Зараз впорядковані словники.
misantroop

1
Технічно, ви хочете, щоб перший елемент словникових клавіш, якщо ви впевнені, є лише один ключ.
DBX12

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

6

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

Я спробував 7 різних підходів і виявив, що цей мій кращий був на моєму Macbook 2014 з Python 3.6:

def first_5():
    for key in biased_dict:
        return key

Результатами їх профілювання були:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

Усі підходи, які я спробував, тут:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

1
Отже, робити цикл і повернути перший ключ (first_5) насправді найшвидший, як я бачу? Також приємне порівняння різних підходів.
PiMathCLanguage

1
так, і не просто найшвидший, але найшвидший на милі країни. Також найпростіший для читання, зручний.
туріяг

4

Настільки ж просто, відповідь на думку мене буде

first = list(prices)[0]

перетворивши словник у список, виведемо ключі, і ми виберемо першу клавішу зі списку.


Для python3 не потрібно створювати цілий новий список, щоб отримати лише його перший елемент. Краще використовувати next(iter(prices)), як уже пропонують інші відповіді.
Норманій

1

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

for key, value in prices.items():
    print(key)

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

for key in prices.keys():
    print(key)

Це надасть доступ лише до ключів, як keys()випливає з методу.


1

d.keys () [0], щоб отримати індивідуальний ключ.

Оновлення: - @AlejoBernardin, я не впевнений, чому ти сказав, що це не працює. тут я перевірив і це спрацювало. імпортувати колекції

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'банан'


Ідучи за кількістю голосів, чому це не найкраще вдале рішення?
GuSuku

18
Це працює в python2, але не в python3. У python3 dict.keys()повертає 'dict_keys' objectзамість a list, що не підтримує індексацію.
mavix

TypeError: 'dict_keys' об’єкт не підтримує індексацію
anilbey

0

Використовуйте цикл for, що проходить через усі клавіші в prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

Переконайтеся , що ви зміните prices.items()до , prices.iteritems()якщо ви використовуєте Python 2.x


0

Якщо ви просто хочете перший ключ зі словника, ви повинні використовувати те, що багато хто пропонував раніше

first = next(iter(prices))

Однак якщо ви хочете перше, а решту збережете як список, ви можете використовувати оператор розпакування значень

first, *rest = prices

Те ж саме стосується на цінності, замінюючи pricesз prices.values()і як ключ і значення , яке ви можете використовувати навіть розпакування призначення

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

Примітка. Ви можете спокуситись first, *_ = pricesотримати перший ключ, але, як правило , я б радив проти цього використання, якщо словник не дуже короткий, оскільки він перетинає всі клавіші та створює список для restнакладних.

Примітка. Як зазначають інші, порядок вставки зберігається від python 3.7 (або технічно 3.6) і вище, тоді як попередні реалізації повинні розглядатися як невизначений порядок.


-3

Найпростіший спосіб:

first_key = my_dict.keys()[0]

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

first_key = list(my_dict.keys())[0]

3
Він піднімається TypeError: 'dict_keys' object is not subscriptable, принаймні, з Python 3.8
Eerik Sven Puudist
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.