2016-12-01 4 views
0

die Frage ist trivial, aber ich bin nicht in der Lage, es zu tun.Python Filter Wörterbuch eindeutige Werte in einem Schlüssel und erstellen Sie ein anderes gefiltertes Wörterbuch

Ich habe diese erste Wörterbuch:

d = {'res': [1.1, 2.2, 1.2, 4.5, 1.5, 3.4], 'sp': [1, 1, 2, 3, 4, 4], 'obs': [1, 2, 3, 4, 5, 6]} 

Ich möchte jeden Wert der sp Schlüssel nehmen und es in der Tonart eines neuen Wörterbuch verwandeln, wo für jeden eindeutigen Wert ich ein anderes Wörterbuch haben mit der kohärente andere Schlüsselwerte.

sollte die endgültige Ausgabe viel besser, das Problem erklären:

new_dict = {1: {'res': [1.1, 2.2], 'obs': [1, 2]}, 2: {'res': [1.2], 'obs': [3]}, 3: {'res': [4.5], 'obs': [4]}, 4: {'res': [1.5, 3.4], 'obs': [5, 6]}} 

so die Tasten dieses Wörterbuchs sind die einzigartigen Werte der sp Schlüssel des ursprünglichen Wörterbuch.

Danke Jungs

Antwort

4
d = {'res': [1.1, 2.2, 1.2, 4.5, 1.5, 3.4], 'sp': [1, 1, 2, 3, 4, 4], 'obs': [1, 2, 3, 4, 5, 6]} 

Da Eingang:

r = {} 
for i, v in enumerate(d['sp']): 
    r.setdefault(v, {'res':[],'obs':[]}) 
    r[v]['res'].append(d['res'][i]) 
    r[v]['obs'].append(d['obs'][i]) 

Daraus ergibt sich:

>>> r 
{1: {'res': [1.1, 2.2], 'obs': [1, 2]}, 2: {'res': [1.2], 'obs': [3]}, 3: {'res': [4.5], 'obs': [4]}, 4: {'res': [1.5, 3.4], 'obs': [5, 6]}} 

Um die erste Lösung für eine beliebige Anzahl von Argumenten zu erweitern ist einfach:

r = {} 
keys = set(d) - set(['sp']) 
for i, v in enumerate(d['sp']): 
    if v not in r: 
     r[v] = dict((k, []) for k in keys) 

    for k in keys: 
     r[v][k].append(d[k][i]) 

Dies führt zu demselben Ergebnis.

Mit if v not in r: über setdefault spart das Erstellen einer Menge von Wörterbuch und Liste Objekte, aber wenn die Struktur einfach ist, ist das nicht viel von Kosten.

+0

Dank für die super schnelle Antwort. Ich bekomme diesen Fehler mit Ihrem Code: Traceback (letzter Aufruf zuletzt): Datei "", Zeile 3, in KeyError: 'res' – matteo

+0

Dieser Fehler tritt in diesem Code nicht auf. Welchen Code hast du tatsächlich ausgeführt? –

+0

Entschuldigung, meine Schuld;) Tolle Methode, danke! – matteo

0

Für den allgemeineren Fall (mit beliebiger Anzahl von Schlüsseln)

new_dict = {} 

for current_value in set(d['sp']): 
    new_dict[current_value] = {} 
    indices = [current_value == val for val in d['sp']] 

    for key, values in d.items(): 
     if key != 'sp': 
      filtered_values = [] 
      for value, index in zip(values, indices): 
       if index: 
        filtered_values.append(value) 

      new_dict[current_value][key] = filtered_values 
Verwandte Themen