Wie finden Sie den ersten Schlüssel in einem Wörterbuch?

198

Ich versuche, mein Programm "banana"aus dem Wörterbuch auszudrucken . Was wäre der einfachste Weg, dies zu tun?

Das ist mein Wörterbuch:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}
Slagoy
quelle
35
Wörterbücher in Python sind ungeordnet, daher gibt es keinen "ersten Schlüssel". Siehe hier
David Robinson
2
Möchten Sie das Wort "Banane" oder den mit "Banane" verbundenen Wert (in diesem Fall 4) wörtlich drucken?
Paul H
to print out banana with a FOR loop, so when I run it, each key would also be printed outMeinst du for k in prices: print k? Dadurch werden alle Schlüssel im Wörterbuch ausgedruckt.
David Robinson
7
zum ersten Kommentar: In Python 3.6+ werden Wörterbücher bestellt (siehe stackoverflow.com/questions/39980323/… )
Egirus Ornila

Antworten:

283

In einer Python-Version, in der Diktate tatsächlich bestellt werden, können Sie dies tun

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

Für die Bestellung von Dicts benötigen Sie Python 3.7+ oder 3.6+, wenn Sie sich auf die technisch und implementierungsdetailmäßig geordnete Art von Dicts in Python 3.6 verlassen können.

Für frühere Python-Versionen gibt es keinen "ersten Schlüssel".

maxbellec
quelle
29
Wenn Sie sowohl Schlüssel als auch Wert in Python 3 wollen:next(iter( my_dict.items() ))
Jonathan H
@ RyanHaining Python-Dikte werden durch Einfügen ab CPython 3.6 und jede andere Python-Implementierung ab Python 3.7
Boris
1
Diese Antwort hat meine Debugging-Sitzung durcheinander gebracht, auf die ich 6 Stunden gewartet habe, um zum Haltepunkt zu gelangen. Das ist sehr ärgerlich.
Michael
126

Ein Wörterbuch ist nicht indiziert, aber in gewisser Weise geordnet. Folgendes würde Ihnen den ersten vorhandenen Schlüssel geben:

list(my_dict.keys())[0]
ylnor
quelle
24
Wäre das nicht einfacher zu sagen, list(my_dict)[0]da die Liste der Schlüssel trotzdem abgerufen wird?
Jean-Francois T.
@ Jean-FrancoisT. ja
Ryan Haining
Wörterbücher sind jetzt in CPython 3.6 und allen anderen Python-Implementierungen bestellt, beginnend mit Python 3.7
Boris
51

Update: Ab Python 3.7 wird die Einfügereihenfolge beibehalten, sodass Sie hier keine benötigen OrderedDict. Sie können die folgenden Ansätze mit einem normalen verwendendict

In Version 3.7 geändert: Die Wörterbuchreihenfolge ist garantiert die Einfügereihenfolge. Dieses Verhalten war ein Implementierungsdetail von CPython aus Version 3.6.

Quelle


Python 3.6 und früher *

Wenn Sie von einem Stammkunden sprechen dict, bedeutet der "erste Schlüssel" nichts. Die Schlüssel werden in keiner Weise bestellt, auf die Sie sich verlassen können. Wenn Sie über Ihre iterieren, werden dictSie wahrscheinlich nicht "banana"als erstes sehen.

Wenn Sie die Dinge in Ordnung halten möchten, müssen Sie ein OrderedDictund nicht nur ein einfaches Wörterbuch verwenden.

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

Wenn Sie dann alle Schlüssel der Reihe nach anzeigen möchten , können Sie dies tun, indem Sie sie durchlaufen

for k in prices:
    print(k)

Sie können alternativ alle Schlüssel in eine Liste einfügen und dann damit arbeiten

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

Ein schnellerer Weg, um das erste Element zu erhalten, ohne eine Liste zu erstellen, besteht darin, nextden Iterator aufzurufen . Dies lässt sich jedoch nicht gut verallgemeinern, wenn versucht wird, das nthElement abzurufen

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

* CPython hatte die Einfügereihenfolge als Implementierungsdetail in 3.6 garantiert.

Ryan Haining
quelle
Danke für den Hinweis. Es tut mir leid, dass ich nicht klarer bin. Ich versuche nur, den Code zu finden, mit dem ich "Banana" ausdrucken kann, NICHT den damit verbundenen Wert. Vielen Dank für die Eingabe!
Slagoy
31

Für Python 3 entfällt der Aufwand für die Listenkonvertierung:

first = next(iter(prices.values()))
Shital Shah
quelle
10

Der dictTyp ist eine ungeordnete Zuordnung, daher gibt es kein "erstes" Element.

Was Sie wollen, ist wahrscheinlich collections.OrderedDict.


quelle
oder ein benanntes Tupel vielleicht, wenn es unveränderlich ist
Joran Beasley
Dies hat sich ab Python 3.6 geändert. Wörterbücher sind jetzt bestellt.
misantroop
1
Technisch gesehen möchten Sie das erste Element der Wörterbuchschlüssel, wenn Sie sicher sind, dass es nur einen Schlüssel gibt.
DBX12
man könnte den ersten Punkt sagen, während man über ein Diktat iteriert, das ifs behoben hat. Aber viel Glück beim Herausfinden.
Demongolem
6

Also habe ich diese Seite gefunden, als ich versucht habe, etwas zu optimieren, um den einzigen Schlüssel in einem Wörterbuch bekannter Länge 1 zu nehmen und nur den Schlüssel zurückzugeben. Der folgende Vorgang war der schnellste für alle Wörterbücher, die ich bis zur Größe 700 ausprobiert habe.

Ich habe 7 verschiedene Ansätze ausprobiert und festgestellt, dass dieser auf meinem 2014er Macbook mit Python 3.6 der beste ist:

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

Die Ergebnisse der Profilerstellung waren:

  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

Alle Ansätze, die ich ausprobiert habe, sind hier:

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
quelle
1
Eine for-Schleife durchzuführen und den ersten Schlüssel (first_5) zurückzugeben, ist also tatsächlich der schnellste, wie ich sehen kann? Auch ein schöner Vergleich der verschiedenen Ansätze.
PiMathCLanguage
1
Ja, und nicht nur der schnellste, sondern der schnellste auf einer Landmeile. Auch am einfachsten zu lesen, bequem.
Turiyag
4

Genauso einfach wird die Antwort meiner Meinung nach sein

first = list(prices)[0]

Wenn Sie das Wörterbuch in eine Liste konvertieren, werden die Schlüssel ausgegeben und der erste Schlüssel aus der Liste ausgewählt.

narwanimonisch
quelle
Für Python3 muss keine neue Liste erstellt werden, um nur das erste Element abzurufen. Bessere Verwendung next(iter(prices)), wie bereits in anderen Antworten vorgeschlagen.
Normanius
1

Wie viele andere darauf hingewiesen haben, gibt es keinen ersten Wert in einem Wörterbuch. Die Sortierung in ihnen ist willkürlich und Sie können nicht davon ausgehen, dass die Sortierung bei jedem Zugriff auf das Wörterbuch gleich ist. Wenn Sie jedoch die Schlüssel drucken möchten, gibt es verschiedene Möglichkeiten:

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

Diese Methode verwendet die Tupelzuweisung, um auf den Schlüssel und den Wert zuzugreifen. Dies ist praktisch, wenn Sie aus irgendeinem Grund sowohl auf den Schlüssel als auch auf den Wert zugreifen müssen.

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

Dies ermöglicht nur den Zugriff auf die Schlüssel, wie es die keys()Methode impliziert.

kylie.a
quelle
1

d.keys () [0], um den einzelnen Schlüssel zu erhalten.

Update: - @AlejoBernardin, ich bin mir nicht sicher, warum du gesagt hast, dass es nicht funktioniert hat. hier habe ich nachgesehen und es hat funktioniert. Sammlungen importieren

prices  = collections.OrderedDict((

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

'Banane'

Amit Sharma
quelle
Warum ist dies nach der Anzahl der Stimmen nicht die beste gute Lösung?
GuSuku
18
Dies funktioniert in Python2, aber nicht in Python3. Gibt in Python3 dict.keys()a 'dict_keys' objectanstelle von a zurück list, was die Indizierung nicht unterstützt.
Mavix
TypeError: Das Objekt 'dict_keys' unterstützt keine Indizierung
anilbey
0

Verwenden Sie eine for-Schleife, die sich durch alle Tasten in erstreckt prices:

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

Stellen Sie sicher, dass Sie zu wechseln prices.items(), prices.iteritems()wenn Sie Python 2.x verwenden

Mark M.
quelle
0

Wenn Sie nur den ersten Schlüssel aus einem Wörterbuch möchten, sollten Sie das verwenden, was viele zuvor vorgeschlagen haben

first = next(iter(prices))

Wenn Sie jedoch den ersten möchten und den Rest als Liste behalten möchten, können Sie den Operator zum Entpacken von Werten verwenden

first, *rest = prices

Das Gleiche gilt für Werte, die durch Ersetzen pricesdurch prices.values()und für Schlüssel und Wert ersetzt werden. Sie können sogar die Entpackungszuweisung verwenden

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

Hinweis: Sie könnten versucht sein, first, *_ = pricesnur den ersten Schlüssel zu erhalten, aber ich würde generell von dieser Verwendung abraten, es sei denn, das Wörterbuch ist sehr kurz, da es alle Schlüssel durchläuft und eine Liste für das erstellt, was resteinen gewissen Overhead hat.

Hinweis: Wie von anderen erwähnt, wird die Einfügereihenfolge ab Python 3.7 (oder technisch 3.6) und höher beibehalten, während frühere Implementierungen als undefinierte Reihenfolge angesehen werden sollten.

wihlke
quelle
-3

Der einfachste Weg ist:

first_key = my_dict.keys()[0]

Manchmal sollten Sie jedoch vorsichtiger sein und sicherstellen, dass Ihre Entität eine wertvolle Liste ist.

first_key = list(my_dict.keys())[0]
nasim seifi
quelle
3
Es erhöht sich TypeError: 'dict_keys' object is not subscriptablezumindest mit Python 3.8
Eerik Sven Puudist