Jak znaleźć pierwszy klucz w słowniku?


202

Usiłuję nakłonić mój program do wydrukowania "banana"ze słownika. Jaki byłby najprostszy sposób to zrobić?

To jest mój słownik:

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

35
Słowniki w Pythonie są nieuporządkowane, więc nie ma „pierwszego klucza”. Zobacz tutaj
David Robinson

2
Czy chcesz wydrukować dosłownie słowo „banan” lub wartość powiązaną z „bananem” (w tym przypadku 4)?
Paul H

to print out banana with a FOR loop, so when I run it, each key would also be printed outCzy masz na myśli for k in prices: print k? Spowoduje to wydrukowanie wszystkich kluczy w słowniku.
David Robinson


8
do pierwszego komentarza: w Pythonie 3.6+ słowniki są zamawiane (patrz stackoverflow.com/questions/39980323/... )
Egirus Ornila

Odpowiedzi:


286

W wersji w języku Python, w której dyktanda są faktycznie uporządkowane, możesz to zrobić

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

Aby zamówić dykty, potrzebujesz Python 3.7+ lub 3.6+, jeśli nie masz nic przeciwko poleganiu na technicznie szczegółowej implementacji szczegółów dykt w Pythonie 3.6.

We wcześniejszych wersjach Pythona nie ma „pierwszego klucza”.


31
Jeśli chcesz zarówno klucz, jak i wartość w Pythonie 3:next(iter( my_dict.items() ))
Jonathan H

@RyanHaining Dykty w języku Python są uporządkowane poprzez wstawienie zaczynające się od CPython 3.6 i dowolnej innej implementacji Python zaczynającej się od Python 3.7
Boris

1
ta odpowiedź zepsuła moją sesję debugowania, na którą czekałem 6 godzin, aby dostać się do punktu przerwania. To bardzo denerwujące.
Michael

129

Słownik nie jest indeksowany, ale jest w pewien sposób uporządkowany. Poniższe dane dają pierwszy istniejący klucz:

list(my_dict.keys())[0]

25
Czy nie byłoby to łatwiejsze do wprowadzenia, list(my_dict)[0]ponieważ i tak pobierze listę kluczy?
Jean-Francois T.,

@ Jean-FrancoisT. tak
Ryan Haining

Słowniki są teraz zamawiane w CPython 3.6 i wszystkich innych implementacjach Pythona, zaczynając od Python 3.7
Boris,

53

Aktualizacja: od wersji Python 3.7 kolejność wstawiania jest zachowana, więc nie potrzebujesz OrderedDicttutaj. Możesz użyć poniższych podejść z normalnymdict

Zmieniono w wersji 3.7: kolejność wstawiania słownika jest gwarantowana. To zachowanie było szczegółową implementacją CPython z 3.6.

źródło


Python 3.6 i wcześniejsze *

Jeśli mówisz o zwykłym dict, to „pierwszy klucz” nic nie znaczy. Klucze nie są zamawiane w żaden sposób, na którym można polegać. Jeśli wykonasz iterację dict, prawdopodobnie nie dostaniesz "banana"pierwszej rzeczy, którą zobaczysz.

Jeśli chcesz zachować porządek, musisz użyć OrderedDictzwykłego słownika.

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

Jeśli następnie chciałbyś zobaczyć wszystkie klucze w porządku, możesz to zrobić poprzez iterację

for k in prices:
    print(k)

Możesz alternatywnie umieścić wszystkie klucze na liście, a następnie pracować z tym

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

Szybszym sposobem na uzyskanie pierwszego elementu bez tworzenia listy byłoby wywołanie nextiteratora. To jednak nie uogólnia się przy próbie uzyskania nthelementu

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

* CPython miał gwarantowaną kolejność wstawiania jako szczegół implementacji w 3.6.


Dzięki za radę. Przepraszam, że nie jestem bardziej klarowny. Próbuję tylko znaleźć kod, który pozwoli mi wydrukować „Banana”, a NIE wartość z nim związaną. Dzięki za cały wkład!
slagoy

32

Dla Python 3 poniżej eliminuje narzut związany z konwersją list:

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

10

dictTyp jest nieuporządkowana mapowanie, więc nie ma czegoś takiego jak „pierwszy” elementu.

Prawdopodobnie chcesz tego collections.OrderedDict.


lub imiennik, może jeśli jest niezmienny
Joran Beasley

Zmieniło się to od wersji Python 3.6. Słowniki są teraz uporządkowane.
misantroop

1
Cóż, technicznie rzecz biorąc, chcesz mieć pierwszy element kluczy słownika, jeśli masz pewność, że jest tylko jeden klucz.
DBX12,

można powiedzieć pierwszy element podczas iteracji nad dyktando, które, jeśli zostanie naprawione. Ale powodzenia przy rozwiązywaniu tego.
demongolem

6

Znalazłem więc tę stronę, próbując zoptymalizować rzecz, biorąc jedyny klucz w słowniku o znanej długości 1 i zwracając tylko klucz. Poniższy proces był najszybszy dla wszystkich słowników, które wypróbowałem do rozmiaru 700.

Wypróbowałem 7 różnych podejść i okazało się, że ten był najlepszy na moim MacBooku 2014 z Python 3.6:

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

Wyniki ich profilowania były następujące:

  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

Wszystkie podejścia, które próbowałem, są tutaj:

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
Więc wykonanie pętli for i zwrócenie pierwszego klucza (first_5) jest w rzeczywistości najszybsze, jak widzę? Również miłe porównanie różnych podejść.
PiMathCLanguage

1
tak, i nie tylko najszybszy, ale najszybszy według mili krajowej. Również najłatwiejszy do odczytania, wygodnie.
turiyag

4

Według mnie odpowiedź będzie prosta

first = list(prices)[0]

przekonwertowanie słownika na listę wygeneruje klucze, a my wybierzemy pierwszy klucz z listy.


W przypadku python3 nie ma potrzeby tworzenia całej nowej listy, aby pobrać tylko jej pierwszy element. Lepsze wykorzystanie next(iter(prices)), jak już sugerują inne odpowiedzi.
normanius

1

Jak wielu innych zauważyło, w słowniku nie ma pierwszej wartości. Sortowanie w nich jest dowolne i nie można liczyć na to, że sortowanie będzie takie samo przy każdym dostępie do słownika. Jeśli jednak chcesz wydrukować klucze na kilka sposobów:

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

Ta metoda używa przypisania krotek, aby uzyskać dostęp do klucza i wartości. Jest to przydatne, jeśli z jakiegoś powodu musisz uzyskać dostęp zarówno do klucza, jak i do wartości.

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

To daje dostęp tylko do kluczy, jak keys()sugeruje metoda.


1

d.keys () [0], aby uzyskać indywidualny klucz.

Aktualizacja: @AlejoBernardin, nie jestem pewien, dlaczego powiedziałeś, że to nie działa. tutaj sprawdziłem i zadziałało. importuj kolekcje

prices  = collections.OrderedDict((

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

'banan'


Biorąc pod uwagę liczbę głosów, dlaczego nie jest to najlepsze dobre rozwiązanie?
GuSuku

18
Działa to w python2, ale nie w python3. W python3 dict.keys()zwraca 'dict_keys' objectzamiast zamiast a list, który nie obsługuje indeksowania.
mavix

TypeError: Obiekt „dict_keys” nie obsługuje indeksowania
anilbey,

0

Użyj pętli for, która obejmuje wszystkie klucze w prices:

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

Upewnij się, że zmieniłeś prices.items()na, prices.iteritems()jeśli używasz Python 2.x


0

Jeśli chcesz tylko pierwszy klucz ze słownika, powinieneś użyć tego, co wielu sugerowało wcześniej

first = next(iter(prices))

Jednak jeśli chcesz pierwszy i zachować resztę jako listę, możesz użyć operatora rozpakowywania wartości

first, *rest = prices

To samo ma zastosowanie w sprawie wartości, zastępując pricesz prices.values()i zarówno dla klucza i wartości można nawet użyć rozpakowywania zadanie

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

Uwaga: Możesz mieć ochotę użyć first, *_ = pricespierwszego klucza, ale generalnie odradzam to użycie, chyba że słownik jest bardzo krótki, ponieważ zapętla wszystkie klawisze i tworzy listę dla niego rest.

Uwaga: Jak wspomnieli inni, kolejność wstawiania jest zachowana od Pythona 3.7 (lub technicznie 3.6) i wyżej, podczas gdy wcześniejsze implementacje powinny być traktowane jako nieokreślona kolejność.


-3

najprostszym sposobem jest:

first_key = my_dict.keys()[0]

ale czasami powinieneś być bardziej ostrożny i upewnić się, że twoja istota jest cenną listą, więc:

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

3
Podnosi TypeError: 'dict_keys' object is not subscriptable, przynajmniej w Pythonie 3.8
Eerik Sven Puudist
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.