it-swarm.com.de

Schlüssel aus Wert im Python-Wörterbuch suchen:

Ziemlich neu bei Python, immer noch mit so vielen Informationen zu kämpfen.

In der gesamten Dokumentation, die ich über Wörterbücher gesehen habe, werden verschiedene Möglichkeiten erläutert, wie man einen Wert über einen Schlüssel abruft.

Ich weiß, dass ich die Schlüssel durchlaufen und ihre Werte überprüfen kann, bis ich den Wert finde, nach dem ich suche, und dann den Schlüssel greife, aber ich suche nach einer direkten Route.

12
Vector

Es gibt keine direkte Route. Mit Listenverständnissen ist es jedoch ziemlich einfach;

[k for k, v in d.iteritems() if v == desired_value]

Wenn Sie dies gelegentlich tun müssen und nicht der Meinung sind, dass es sich lohnt, den Index auch in die andere Richtung zu indexieren, können Sie Folgendes tun:

class bidict(dict):
    def key_with_value(self, value, default=None):
        for k, v in self.iteritems():
            if v == value:
                return v
        return default

    def keys_with_value(self, value, default=None):
        return [v for k, v in self.iteritems() if v == value]

Dann würde sich d.key_with_value eher wie d.get verhalten, nur andersherum.

Sie können auch eine Klasse erstellen, die automatisch in beide Richtungen indiziert. Schlüssel und Wert müssten dann beide hashierbar sein. Hier sind drei Möglichkeiten, wie es implementiert werden könnte:

  • In zwei verschiedenen Diktaten, wobei einige dikteartige Methoden aufgedeckt wurden; Sie könnten vielleicht foo.by_key[key] oder foo.by_value[value] tun. (Kein Code gegeben, da er komplizierter ist und ich bin faul und ich denke, das ist sowieso suboptimal.)

  • In einer anderen Struktur, so dass Sie d[key] und d.inverse[value] ausführen könnten:

    class bidict(dict):
        def __init__(self, *args, **kwargs):
            self.inverse = {}
            super(bidict, self).__init__(key, value)
    
        def __setitem__(self, key, value):
            super(bidict, self).__setitem__(key, value)
            self.inverse[value] = key
    
        def __delitem__(self, key):
            del self.inverse[self[key]]
            super(bidict, self).__delitem__(key)
    
  • In derselben Struktur, so dass Sie d[key] und d[value] ausführen könnten:

    class bidict(dict):
        def __setitem__(self, key, value):
            super(bidict, self).__setitem__(key, value)
            super(bidict, self).__setitem__(value, key)
    
        def __delitem__(self, key):
            super(bidict, self).__delitem__(self[key])
            super(bidict, self).__delitem__(key)
    

(Bei diesen Implementierungen einer bidict fehlt die update-Methode, die etwas komplexer ist (aber help(dict.update) zeigt an, was Sie abdecken müssten.) Ohne update würde bidict({1:2}) nicht das tun, was beabsichtigt war, oder d.update({1:2}) .)

Überlegen Sie auch, ob eine andere Datenstruktur angemessener wäre.

27
Chris Morgan

Da Ihr Wörterbuch doppelte Werte enthalten kann (d. H. {'a': 'A', 'b': 'A'}), besteht die einzige Möglichkeit zum Ermitteln eines Schlüssels aus einem Wert darin, das Wörterbuch wie beschrieben zu durchlaufen.

Oder ... bauen Sie das gegenüberliegende Wörterbuch auf. Sie müssen es nach jeder Änderung des ursprünglichen Wörterbuchs neu erstellen.

Oder ... schreiben Sie eine Klasse, die beide Wörterbücher verwaltet. Sie müssen Situationen verwalten, in denen doppelte Werte angezeigt werden.

6
eumiro

die erste Lösung mit dem Listenverständnis ist gut. aber ein kleines Update für Python 3.x, statt .iteritems() sollte es nur .items() sein

[k for k, v in d.items() if v == desired_value]
1
Idan Richman

Das Erstellen eines anderen Wörterbuchs ist überhaupt nicht gut, da ein oder mehrere Schlüssel denselben Wert haben, aber wenn Sie es invertieren, müssen Sie die Schlüssel: [Wert1, ...] - Struktur einfügen, die Sie zu einem anderen Problem führt.

0
Raj Damani