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.