Greifen Sie in Python auf ein beliebiges Element in einem Wörterbuch zu

507

Wenn a mydictnicht leer ist, greife ich auf ein beliebiges Element zu:

mydict[mydict.keys()[0]]

Gibt es einen besseren Weg, dies zu tun?

Stan
quelle
3
Was er gesagt hat ... das ist wirklich nur eine gültige Frage, wenn es nur ein Element im Diktat gibt oder es dir egal ist, welches du zurück bekommst.
Royal
5
Ja, ich muss nur auf jedes Element im Diktat zugreifen, deshalb möchte ich auf das erste Element zugreifen.
Stan
2
@ Stan: aber wie Greg sagte, gibt es kein bestimmtes "erstes" Element im Diktat. Vielleicht sollten Sie Ihre Frage ändern, um ganz klar zu sein
tdihp
10
Ich denke, das ist eine berechtigte Frage. Wenn Sie auf ein beliebiges Element zugreifen müssen und sicher sind, dass das Diktat nicht leer ist, ist es möglicherweise eine gute Idee, nach dem "ersten" zu fragen, da die Anzahl der Elemente möglicherweise nicht bekannt ist.
Kap
7
@MichaelScheper Sie müssen zur Liste besetzen : list(mydict.keys())[0].
Daniel Moskovich

Antworten:

600

Unter Python 3 zerstörungsfrei und iterativ:

next(iter(mydict.values()))

Unter Python 2 zerstörungsfrei und iterativ:

mydict.itervalues().next()

Wenn Sie möchten, dass es sowohl in Python 2 als auch in Python 3 funktioniert, können Sie das sixPaket verwenden:

six.next(six.itervalues(mydict))

obwohl es zu diesem Zeitpunkt ziemlich kryptisch ist und ich lieber Ihren Code bevorzugen würde.

Wenn Sie ein Element entfernen möchten, gehen Sie wie folgt vor:

key, value = mydict.popitem()

Beachten Sie, dass "first" hier möglicherweise kein geeigneter Begriff ist, da dictes sich bei Python <3.6 nicht um einen geordneten Typ handelt. Python 3.6+ dictssind bestellt.

doublep
quelle
35
Meinst du nicht dict.iterkeys().next()?
John Machin
12
@ John Machin: Nun, die Frage scheint auf den Wert des ersten Schlüssels zuzugreifen, also mache ich das auch in der Antwort.
Doublep
5
das sieht besser aus: dict.values().__iter__().__next__():)
Vitaly Zdanevich
17
Es ist ärgerlich, dass dict.keys () nicht direkt iterierbar ist.
Semiomant
3
Für ein zerstörungsfreies Popitem können Sie eine (flache) Kopie erstellen:key, value = dict(d).popitem()
Pelle
140

Wenn Sie nur auf ein Element zugreifen müssen (zufällig das erste, da Diktate keine Bestellung garantieren), können Sie dies einfach in Python 2 tun :

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

Bitte beachten Sie, dass Python (meines Wissens nach) nicht garantiert, dass 2 aufeinanderfolgende Aufrufe einer dieser Methoden eine Liste mit derselben Reihenfolge zurückgeben. Dies wird mit Python3 nicht unterstützt.

in Python 3 :

list(my_dict.keys())[0]     -> key of "first" element
list(my_dict.values())[0]   -> value of "first" element
list(my_dict.items())[0]    -> (key, value) tuple of "first" element
swK
quelle
90
Das funktioniert nur in Python 2.x, für 3.x müssen Sie verwendenlist(my_dict.keys())[0]
alldayremix
6
Also, welche Komplexitätsklasse ist das? Sicher list(my_dict.keys())[0]ist nicht faul?
Evgeni Sergeev
1
Um zu verdeutlichen, was @alldayremix mit diesem Kommentar in Python 3.x bedeutet, unterstützen die Ergebnisse von my_dict.function () die Indizierung nicht. Deshalb müssen wir es zuerst in eine Liste konvertieren und können dann den Index [0] verwenden.
Noki
57

In Python3 ist der Weg:

dict.keys() 

Geben Sie einen Wert vom Typ "dict_keys ()" zurück. Wir erhalten eine Fehlermeldung, wenn Sie das erste Mitglied der Schlüssel von dict auf folgende Weise erhalten:

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

Schließlich konvertiere ich dict.keys () in list @ 1st und erhalte das erste Mitglied per Listenspleißmethode:

list(dict.keys())[0]
Xb74Dkjb
quelle
Dies ist die einfachste Lösung und funktioniert sowohl in Python2 als auch in Python3.
Mattmilten
Für mein Geld. Ich sage, diese Antwort ist die intuitivste
Thomas Valadez
Ja, aber dies beantwortet nicht die OP-Frage, wie man zu den WERTEN kommt, nicht zu den Schlüsseln.
Mike Williamson
1
@ MikeWilliamson Hoffentlich wissen die meisten Leser, wie sie den entsprechenden Wert bei gegebenem Schlüssel aus einem Python-Diktat erhalten.
Eric
5
Um ein beliebiges Element und keinen beliebigen Schlüssel zu erhalten, können Sie dies analog tun list(dict.values())[0].
Jhin
24

einen Schlüssel bekommen

next(iter(mydict))

einen Wert bekommen

next(iter(mydict.values()))

um beides zu bekommen

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

Die ersten beiden sind Python 2 und 3. Die letzten beiden sind in Python 3 faul, aber nicht in Python 2.

maxbellec
quelle
16

Wie bereits erwähnt, gibt es kein "erstes Element", da Wörterbücher keine garantierte Reihenfolge haben (sie sind als Hash-Tabellen implementiert). Wenn Sie beispielsweise den Wert wünschen, der dem kleinsten Schlüssel entspricht, thedict[min(thedict)]wird dies ausgeführt. Wenn Sie sich für die Reihenfolge interessieren, in der die Schlüssel eingefügt wurden, dh mit "zuerst" "frühestens eingefügt" meinen, können Sie in Python 3.1 Sammlungen verwenden.OrderedDict , das auch im kommenden Python 2.7 enthalten ist; Laden Sie für ältere Versionen von Python den bestellten dict backport (2.4 und höher) herunter, installieren Sie ihn und verwenden Sie ihn, den Sie hier finden .

Python 3.7 Jetzt werden Diktate nach Einfügung geordnet.

Alex Martelli
quelle
11

Wie wäre es damit. Hier noch nicht erwähnt.

py 2 & 3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
Animaacija
quelle
5
dict.values()gibt eine Ansicht zurück, sollte also O (1) sein. list(a)gibt eine neue Liste zurück, wäre also O (n).
Boycy
Es scheint auch, dass es in Python2 nicht funktioniert, wenn a = {"a": {"1"}}
qasimzee
11

Wenn Sie Probleme bei der Reihenfolge von Diktaten ignorieren, ist dies möglicherweise besser:

next(dict.itervalues())

Auf diese Weise vermeiden wir die Suche nach Elementen und generieren eine Liste von Schlüsseln, die wir nicht verwenden.

Python3

next(iter(dict.values()))
Matt Joiner
quelle
2
values ​​() erstellt eine Kopie aller Werte (ebenso wie keys () für keys), sodass viele Operationen O (n ^ 2) ausgeführt werden.
Glenn Maynard
Also wird die OP-Version? Ich werde dies ändern, um dann einen Iterator zu verwenden.
Matt Joiner
4
Dies ist nur Python 2. Für Python 3 müssen wir next(iter(dict.values()))das gleiche Ergebnis erzielen, ohne die Liste zu erstellen.
Kap
6

In Python3

list(dict.values())[0]
Oleg Matei
quelle
4
Was passiert, wenn das Wörterbuch eine Milliarde Einträge enthält? :)
Fábio Dias
2

Sie können immer tun:

for k in sorted(d.keys()):
    print d[k]

Auf diese Weise erhalten Sie einen konsistent sortierten (in Bezug auf den eingebauten .hash () - Schlüsselsatz, den Sie verarbeiten können, wenn die Sortierung für Sie eine Bedeutung hat. Das bedeutet, dass beispielsweise numerische Typen auch dann konsistent sortiert werden, wenn Sie das Wörterbuch erweitern.

BEISPIEL

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

Beachten Sie, dass das Wörterbuch beim Drucken sortiert ist. Aber der Schlüsselsatz ist im Wesentlichen eine Hashmap!

Philipp Meier
quelle
2

Für Python 2 und 3:

import six

six.next(six.itervalues(d))
Oblalex
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
Martin Tournoij
Dies beantwortet die Frage genau auf Is there any better way to do this?kurze Weise.
Oblalex
Diese Antwort wurde bereits zweimal gegeben, von denen eine seit fast 5 Jahren auf dieser Website ist. Dies ist ein Kommentar zu einer anderen Antwort (wie in: Hier erfahren Sie, wie Sie die Antwort verbessern, damit sie sowohl mit Python 2 als auch mit Python 3 funktioniert ) und keine "neue" Antwort als solche. Das Überprüfungssystem von SO hat in diesem Fall automatisch eine nicht hilfreiche Notiz platziert ...
Martin Tournoij
Nein Sir. Sie haben diese Variante erst vor 17 Stunden zu Ihrer 5-jährigen Antwort hinzugefügt, 1 Stunde nachdem ich diese Antwort geschrieben habe. Versuchen Sie, 'find' auf dieser Seite für 'six' zu verwenden, und Sie werden nur 6 Übereinstimmungen nur in diesen 2 Antworten finden. Wie auch immer, stört Sie diese Antwort wirklich? Ich denke, das könnte in Zukunft anderen Menschen helfen, und das ist in Ordnung. Also, was ist der Deal?
Oblalex
Das liegt daran, dass diese Antwort meiner Meinung nach in erster Linie eine Bearbeitung dieses Beitrags sein sollte. Ohne die Bearbeitung müssten die Benutzer einige Seiten nach unten scrollen, um Ihre Antwort zu sehen. Denken Sie, dass dies nützlicher ist, als eine hoch bewertete Antwort zu bearbeiten, die fast genau mit Ihrer übereinstimmt?
Martin Tournoij
0
first_key, *rest_keys = mydict
user1994083
quelle
11
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Suraj Rao
-1

Keine externen Bibliotheken, funktioniert sowohl mit Python 2.7 als auch mit 3.x:

>>> list(set({"a":1, "b": 2}.values()))[0]
1

Für einen beliebigen Schlüssel lassen Sie einfach .values ​​() weg

>>> list(set({"a":1, "b": 2}))[0]
'a'
Thomas Browne
quelle
-2

Unterklassen dictsind eine Methode, wenn auch nicht effizient. Wenn Sie hier eine Ganzzahl angeben, wird diese zurückgegeben d[list(d)[n]]. Andernfalls greifen Sie wie erwartet auf das Wörterbuch zu:

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'
jpp
quelle