Wenn a mydict
nicht leer ist, greife ich auf ein beliebiges Element zu:
mydict[mydict.keys()[0]]
Gibt es einen besseren Weg, dies zu tun?
list(mydict.keys())[0]
.
Wenn a mydict
nicht leer ist, greife ich auf ein beliebiges Element zu:
mydict[mydict.keys()[0]]
Gibt es einen besseren Weg, dies zu tun?
list(mydict.keys())[0]
.
Antworten:
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 six
Paket 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 dict
es sich bei Python <3.6 nicht um einen geordneten Typ handelt. Python 3.6+ dicts
sind bestellt.
dict.iterkeys().next()
?
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
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
list(my_dict.keys())[0]
list(my_dict.keys())[0]
ist nicht faul?
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]
list(dict.values())[0]
.
next(iter(mydict))
next(iter(mydict.values()))
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.
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.
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
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).
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.
next(iter(dict.values()))
next(iter(dict.values()))
das gleiche Ergebnis erzielen, ohne die Liste zu erstellen.
In Python3
list(dict.values())[0]
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!
Für Python 2 und 3:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
kurze Weise.
first_key, *rest_keys = mydict
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'
Unterklassen dict
sind 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'