2010-08-20 15 views
7

staram się stworzyć coś co następuje:Python odniesienia słownika do sąsiada słowniku elementu

dictionary = { 
    'key1': ['val1','val2'], 
    'key2': @key1 
} 

gdzie @ klucz1 jest odniesienie do słownika [ „klucz1”]. Z góry dziękuję.

+2

co powinno się stać, jeśli zrobisz coś w stylu 'dictionary ['key1'] = 4'? Czy klucz2 powinien zawierać 4, czy powinien nadal odnosić się do oryginalnej listy? –

+0

Podobny do tego pytania, chociaż został opublikowany później: [Co mam zrobić, gdy potrzebuję słownika samooceny?] (Http://stackoverflow.com/questions/3738381/what-do-i-do-when-i -need-a-self-reference-dictionary) –

Odpowiedz

4

Chciałbym rozwinąć wersję Aarona Digulli. Co on teraz jest powielane tutaj:

class DictRef(object): 
    def __init__(self, d, key): self.d, self.key = d, key 

d = {} 
d.update({ 
    'key1': ['val1','val2'], 
    'key2': DictRef(d, 'key1') 
}) 

Zakładam chce replikować prawdziwą semantykę odniesienia, dzięki czemu dostęp do 'key2' zawsze daje sposób, aby dostać się do cokolwiek 'key1' ma jako wartość. Problem polega na tym, że d['key1'] jest , . Aby uzyskać "wartość" od 'key1', wszystko, co musisz zrobić, to d['key1'], ale dla 'key2' musisz wykonać d[d['key2'].key]. Ponadto nie można odwoływać się do odwołań, które działają poprawnie, stałoby się d[d[d['key2'].key].key]. I jak odróżnić referencję od zwykłej wartości? Prawdopodobnie poprzez sprawdzenie typowe z isinstance (v, DictReference) (ew).

Mam propozycję rozwiązania tego wszystkiego.

Osobiście nie rozumiem, dlaczego konieczna jest prawdziwa semantyka odniesienia. Jeśli uznają to za konieczne, mogą być niepotrzebne, poprzez restrukturyzację problemu lub rozwiązanie problemu. Może nawet być to, że nigdy nie były potrzebne, a prosty d.update(key2=d['key1']) rozwiązałby problem.

Zresztą wniosek:

class DictRef(object): 
    def __init__(self, d, key): 
     self.d = d 
     self.key = key 

    def value(self): 
     return self.d[self.key].value() 

class DictVal(object): 
    def __init__(self, value): 
     self._value = value 

    def value(self): 
     return self._value 

d = {} 
d.update(
    key1=DictVal(['val1', 'val2']), 
    key2=DictRef(d, 'key1') 
) 

Teraz, w celu uzyskania wartości dowolny klawisz, czy to odniesienie, czy nie, można by po prostu zrobić d[k].value(). Jeśli istnieją odwołania do referencji, zostaną poprawnie usunięte z listy w łańcuchu. Jeśli tworzą naprawdę długi lub nieskończony łańcuch, Python zawiedzie z RuntimeError dla nadmiernej rekurencji.

4

stosować nową klasę:

class DictRef(object): 
    def __init__(self, d, key): self.d, self.key = d, key 

d = {} 
d.update({ 
    'key1': ['val1','val2'], 
    'key2': DictRef(d, 'key1') 
}) 

Uwaga składnia dziwne, ponieważ nie ma sposobu, aby wiedzieć, wewnątrz której słownik tworzony DictRef.

+3

No cóż, skoro nie można tego zrobić bez odwołania się do d, równie dobrze możemy zrobić 'd = {'key1': [...]}; d.update ({'key2': d ['key2']}) '. – delnan

Powiązane problemy