Как вы находите первый ключ в словаре?

203

Я пытаюсь распечатать программу "banana"из словаря. Какой самый простой способ сделать это?

Это мой словарь:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}
slagoy
источник
35
Словари в Python неупорядочены, поэтому «первый ключ» отсутствует. Смотрите здесь
Дэвид Робинсон
2
Вы хотите буквально напечатать слово «банан» или значение, связанное с «банан» (4, в данном случае)?
Пол Х
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
на первый комментарий: в python 3.6+ словари заказываются (см. stackoverflow.com/questions/39980323/… )
Egirus Ornila

Ответы:

291

На Python-версии, где на самом деле упорядочены dicts, вы можете сделать

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

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

Для более ранних версий Python «первый ключ» отсутствует.

maxbellec
источник
31
Если вам нужны ключ и значение в Python 3:next(iter( my_dict.items() ))
Джонатан Х
@RyanHaining Диктофоны Python упорядочены путем вставки, начиная с CPython 3.6, и любой другой реализации Python, начиная с Python 3.7
Борис
1
этот ответ испортил мой сеанс отладки, который я ждал 6 часов, чтобы добраться до точки останова. Это очень неприятно.
Майкл
134

Словарь не индексируется, но в некотором роде упорядочен. Следующее даст вам первый существующий ключ:

list(my_dict.keys())[0]
ylnor
источник
26
Разве это не будет проще просто поставить, list(my_dict)[0]так как он все равно получит список ключей?
Жан-Франсуа Т.
@ Жан-Francoist. да
Райан
Словари теперь упорядочены в 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.

Райан Хейнинг
источник
Спасибо за совет. Я прошу прощения за то, что не был более ясным. Я просто пытаюсь найти код, который позволит мне распечатать "Банан", а не значение, связанное с ним. Спасибо за весь вклад!
Слагой
33

Для Python 3 ниже исключены накладные расходы на преобразование списка:

first = next(iter(prices.values()))
Шиталь шах
источник
10

dictТип представляет собой неупорядоченное отображение, так что не существует такого понятия , как «первый» элемент.

То, что вы хотите, вероятно collections.OrderedDict.


источник
или именованный кортеж, возможно, если он неизменен
Джоран Бизли
Это изменилось с Python 3.6. Словари теперь заказаны.
misantroop
1
Технически, вам нужен первый элемент ключей словаря, если вы уверены, что есть только один ключ.
DBX12
можно сказать первый элемент, перебирая слова, которые фиксированы. Но удачи в этом.
Демонголем
7

Так что я нашел эту страницу, пытаясь оптимизировать что-то, чтобы взять единственный ключ в словаре известной длины 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
turiyag
источник
1
Так что выполнение цикла for и возврат первого ключа (first_5) на самом деле самый быстрый, как я вижу? Также хорошее сравнение различных подходов.
PiMathCLanguage
1
да, и не только самый быстрый, но самый быстрый на милю страны. Также проще всего читать, удобно.
Турияг
4

Ну как просто, ответ по моему будет

first = list(prices)[0]

Преобразование словаря в список выведет ключи, и мы выберем первый ключ из списка.

narwanimonish
источник
Для python3 нет необходимости создавать целый новый список, чтобы получить только его первый элемент. Лучше использовать next(iter(prices)), как уже предлагали другие ответы.
норманн
1

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

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

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

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

Это даст только доступ к ключам, как и keys()предполагает метод.

kylie.a
источник
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()возвращает a 'dict_keys' objectвместо a list, который не поддерживает индексацию.
Mavix
Ошибка типа: объект '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) и выше, тогда как более ранние реализации следует рассматривать как неопределенный порядок.

wihlke
источник
-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