2017-02-06 4 views
0

Ich habe ein sehr, sehr großes Wörterbuch von Wörterbüchern. Oft sind die Werte gleich, und es scheint, dass es einen Weg geben sollte, die Größe zu reduzieren, indem man einen Bezug auf den gleichen Wörterbuchwert hat.Python Sparse Wörterbuch/wiederholte Werte

Momentan tue ich dies mit einer Zwei-Pass-Methode von "Hat Wert Synonym" gefolgt von Look-up-Wert von Synonym.

Aber im Idealfall wäre es großartig, einen Weg zu haben, dies in einem einzigen Schritt zu tun.

animals = { 
    'cat':{'legs':4,'eyes':2}, 
    'dog':{'legs':4,'eyes':2}, 
    'spider':{'legs':8,'eyes':6}, 
    } 

Ich könnte einen Wert „Säuger“, die so verwendet wird, dass ich sagte ‚Katze‘: Säugetier, aber was ich möchte in der Lage sein zu tun, ‚Hund‘: Tiere [ ‚Katze‘]

Weil als Referenz sollte es weniger Speicher nehmen, was das Ziel ist.

Ich überlege eine Klasse, damit umzugehen, aber ich kann nicht die erste Person sein, die denkt, dass wiederholte Werte in einem Wörterbuch irgendwie "zerquetscht" werden könnten, und würde es am meisten pythisch machen.

Antwort

0

Ich denke, Objekt und Vererbung sind der bessere Weg, um zu tun, was Sie wollen, außer vielleicht für die Sorge des Gedächtnisses.

als Referenz verwendet, anstatt die Werte jedes Wörterbuch zu kopieren, können Sie das ctypes Modul verwenden:

import ctypes 
animals = {'cat':{'legs':4,'eyes':2},'spider':{'legs':8,'eyes':6}} 
# You put the value of animals['cat'] in ['dog'] 
animals['dog'] = id(animals['cat']) 
animals 
{'dog': 47589527749808, 'spider': {'eyes': 6, 'legs': 8}, 'cat': {'eyes': 2, 'legs': 4}} 
# You can access to ['dog'] with 
ctypes.cast(animals['dog'], ctypes.py_object).value 
{'eyes': 2, 'legs': 4} 

Nicht sicher, ob es die „meisten pythonic Weg“ btw ist. Imho-Klasse sind der richtige Weg, dies zu tun.

Ein anderer Weg kann mit der Verwendung der weakref module. Ich weiß nicht viel über dieses, schauen Sie sich diese post und die verschiedenen Antworten für andere Hinweise über die Verwendung von Verweis.

+0

Dies ist hilfreich, zumindest darüber nachzudenken, wie ich das tun könnte. Ich hatte mit einem Wörterbuch der möglichen Werte begonnen, und ein Wörterbuch der Schlüssel mit einer Zeichenfolge, die auf das Diktat der möglichen Werte zeigt. Dies erfordert Dictionary Lookups, und das Speichern der Strings erodiert einen Teil des Speichervorteils. Ich werde ein wenig über CTypes lernen, kann es sein, dass ich eine Art Hybrid von meiner Lösung und von Ihnen machen kann. -Vielen Dank –

Verwandte Themen