481 Stimmen

Wie verwende ich einen Punkt "." um auf Elemente eines Wörterbuchs zuzugreifen?

Wie mache ich Python-Wörterbuchmitglieder über einen Punkt "." zugänglich?

Zum Beispiel würde ich gerne statt mydict['val'] mydict.val schreiben.

Außerdem würde ich gerne auf verschachtelte Wörterbücher auf diese Weise zugreifen. Zum Beispiel

mydict.mydict2.val 

würde sich auf

mydict = { 'mydict2': { 'val': ... } }

32 Stimmen

Viele der Situationen, in denen Menschen verschachtelte Dicts verwenden, könnten genauso gut oder sogar besser durch Dicts mit Tupeln als Schlüssel gelöst werden, wobei d[a][b][c] durch d[a, b, c] ersetzt wird.

0 Stimmen

Können Sie bitte näher erläutern, wie d[a][b][c] durch d[a, b, c] ersetzt werden kann? Ich habe noch nicht verstanden, wie das gemacht werden kann.

9 Stimmen

Es ist kein Zauberei: foo={}; foo[1,2,3] = "one, two, three!"; foo.keys() => [(1,2,3)]

3voto

nehem Punkte 10704
def dict_to_object(dick):
    # http://stackoverflow.com/a/1305663/968442

    class Struct:
        def __init__(self, **entries):
            self.__dict__.update(entries)

    return Struct(**dick)

Wenn man sich entscheidet, dieses dict dauerhaft in ein Objekt umzuwandeln, sollte dies funktionieren. Man kann ein Wegwerfobjekt erstellen, kurz bevor man darauf zugreift.

d = dict_to_object(d)

3voto

deepak Punkte 1943

Diese Lösung ist eine Verfeinerung der von epool angebotenen Lösung, um die Anforderung des OP zur konsistenten Zugriff auf verschachtelte dicts zu erfüllen. Die Lösung von epool erlaubte dies nicht.

class YAMLobj(dict):
    def __init__(self, args):
        super(YAMLobj, self).__init__(args)
        if isinstance(args, dict):
            for k, v in args.iteritems():
                if not isinstance(v, dict):
                    self[k] = v
                else:
                    self.__setattr__(k, YAMLobj(v))

    def __getattr__(self, attr):
        return self.get(attr)

    def __setattr__(self, key, value):
        self.__setitem__(key, value)

    def __setitem__(self, key, value):
        super(YAMLobj, self).__setitem__(key, value)
        self.__dict__.update({key: value})

    def __delattr__(self, item):
        self.__delitem__(item)

    def __delitem__(self, key):
        super(YAMLobj, self).__delitem__(key)
        del self.__dict__[key]

Mit dieser Klasse kann man jetzt etwas wie: A.B.C.D machen.

3voto

Sreeragh A R Punkte 2541

Die Verwendung von namedtuple ermöglicht den Punktzugriff.

Es handelt sich um ein leichtes Objekt, das auch die Eigenschaften eines Tupels hat.

Es ermöglicht, Eigenschaften zu definieren und über den Punktoperator darauf zuzugreifen.

from collections import namedtuple
Data = namedtuple('Data', ['key1', 'key2'])

dataObj = Data(val1, key2=val2) # kann mit Schlüsselargumenten und Positionalargumenten instanziiert werden

Zugriff über den Punktoperator

dataObj.key1 # Gibt val1 zurück
datObj.key2 # Gibt val2 zurück

Zugriff über Tupelindizes

dataObj[0] # Gibt val1 zurück
dataObj[1] # Gibt val2 zurück

Aber denken Sie daran, dies ist ein Tupel; kein dict. Daher führt der folgende Code zu einem Fehler

dataObj['key1'] # Gibt TypeError: tuple indices must be integers or slices, not str zurück

Weiterführende Informationen: namedtuple

2voto

Andrea Di Iura Punkte 448

Es ist eine alte Frage, aber ich habe kürzlich festgestellt, dass sklearn eine implementierte Version von dict hat, die über den Schlüssel zugänglich ist, nämlich Bunch https://scikit-learn.org/stable/modules/generated/sklearn.utils.Bunch.html#sklearn.utils.Bunch

2voto

Sreeragh A R Punkte 2541

Einfachste Lösung.

Definieren Sie eine Klasse nur mit einem pass-Anweisung darin. Erstellen Sie ein Objekt für diese Klasse und verwenden Sie die Punkt-Notation.

class my_dict:
    pass

person = my_dict()
person.id = 1 # Mit Punkt-Notation erstellen
person.phone = 9999
del person.phone # Entfernen einer Eigenschaft mit Punkt-Notation

name_data = my_dict()
name_data.first_name = 'Arnold'
name_data.last_name = 'Schwarzenegger'

person.name = name_data
person.name.first_name # Punkt-Notationszugriff für verschachtelte Eigenschaften - gibt Arnold zurück

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X