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
}
slagoy
źródło
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”.

maxbellec
źródło
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]
ylnor
źródło
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.

Ryan Haining
źródło
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()))
Shital Shah
źródło
10

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

Prawdopodobnie chcesz tego collections.OrderedDict.


źródło
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
turiyag
źródło
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.

narwanimonish
źródło
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.

kylie.a
źródło
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'

Amit Sharma
źródło
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

Mark M.
źródło
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ść.

wihlke
źródło
-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]
nasim seifi
źródło
3
Podnosi TypeError: 'dict_keys' object is not subscriptable, przynajmniej w Pythonie 3.8
Eerik Sven Puudist