2016-07-06 8 views
0

Ich muss Daten aus einer CSV-Datei oder einem Excel-Blatt (mit Zeilen und Spalten) in ein zweidimensionales Python-Dict laden. Zum Beispiel sieht, wenn die Daten in einer Excel-Tabelle wie folgt aus:zweidimensionales Python-Dict mit gemeinsamem Speicher

name age gender location 
1 Jim 18 male China 
2 Ross 18 male China 
3 Cara 19 female Japan 
4 Ted 18 male China 

Dann sollte die Ausgabe Python dict wie folgt aussehen:

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

Sie können sehen, dass es eine Menge von doppelten Infos sind in Dieses 2D-Dict (und für echte Daten, hat es die gleiche Bedingung), so kam ich auf die Idee, ein neues Diktat mit gemeinsamem Speicher zu entwickeln. Um genau zu sein, im obigen Beispiel möchte ich, dass mein 2-d-Diktat nur eine Kopie von {'age': 18, 'gender': 'male', 'location': 'China'} über mehrere Zeilen speichert (diese Zeilen müssen nicht benachbart sein). Wenn wir data[1]['age'] und data[2]['age'] aufrufen, sollte es die Suche in demselben extrahierten kleinen gemeinsamen dict tun.

Ich habe den Quellcode von Python dict gelesen, und ich weiß Python dict nur Zeiger auf Schlüssel und Werte zu speichern (und in der Regel für kleine int und String-Objekt, können verschiedene Zeiger auf das gleiche Objekt zeigen). Wenn ich meine, ich möchte nur eine Kopie speichern, meine ich eine Kopie von Zeigern.

Haben Sie eine Idee, wie Sie dieses Diktat entwerfen? Vielen Dank!!!

EDIT

Sorry, ich vergessen zu erwähnen. Die Daten in diesem 2-d-Diktat sind schreibgeschützt.

+3

Das klingt wie eine sehr schlechte Idee. Wenn Sie Jims Standort ändern, haben sich Ross und Ted plötzlich verändert. –

+0

@Kelvin Sorry, ich habe vergessen zu erwähnen. Die Daten in diesem Diktat werden nur schreibgeschützt sein. –

+3

Wenn es zwischen diesen Personen keine intrinsische gemeinsame Komponente gibt, klingt es nach einem [Komprimierungsalgorithmus] (https://en.wikipedia.org/wiki/ Datenkompression). Beachten Sie, dass dies im Prinzip den Zugriff auf Elemente im Wörterbuch verlangsamt - ein Kompromiss zwischen Speicherplatz und Geschwindigkeit. –

Antwort

1

Ich denke, Sie fragen nach einer Datenkomprimierungslösung, die dann sowohl Speichergrößen als auch die Verwendung von Referenzen berücksichtigen sollte. Der kleinste Speicherabdruck gehört normalerweise zu einer Ganzzahl, die mindestens so klein wie eine Speicherreferenz sein sollte, also würde ich versuchen, alles auf ganze Zahlen abzubilden, es sei denn, es ist zu unpraktisch. Außerdem sind Listen kleiner als Wörterbücher und ermöglichen eine direkte schnelle Indexierung.

Hier ist eine alternative Implementierung, die einige Ideen auslösen könnten:

import sys 

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

In [43]: sys.getsizeof(data) 
Out[43]: 280 # bytes 

data_list = [ 
    ('Jim', 18, 0, 'CH'),  # 'CH' => 'China' 
    ('Ross', 18, 0, 'CH'), # 0 => Female, 1 => Male 
    ('Cara', 19, 1, 'JP'), # 'JP' => 'Japan' 
    ('Ted', 18, 0, 'CH') 
] 


In [44]: sys.getsizeof(data_list) 
Out[44]: 104 # bytes 

_name, _age, _gender, _location = 0, 1, 2, 3 

In [45]: data_list[2][_age] # access as 2D array instead of 2-level dict 
Out[45]: 19 

Die Lösung oben wird ein wenig langsamer sein, aber einige Vorteile für große Strings ergeben. Die Verwendung von Referenzen wird wahrscheinlich nichts speichern, solange nicht jeder Datensatz lang wird. Wenn Sie schließlich alle Werte durch Integer anstelle von String-Namen und Ländercodes ersetzen, werden Sie die Python-Listen ziemlich komprimieren.

Wenn Sie wirklich wollen in numerische Codes wählen, die beste Kompression geben wird, schauen Sie in die Huffman-Codierung, zum Beispiel diese Seite: http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding

Verwandte Themen