Dict in Dict-Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

hi
ich versuche eine liste geordnet in ein dict zu übernehmen.
rate mal, ob das klappt? NEIN, klappt natürlich nicht!!! :(
ich versuche, das ergebnis von result_dict zu erhalten:

Code: Alles auswählen

lst = [['Niederlassungen', 'Spalte', [4, 0, '']],
       ['Niederlassungen', 'Doppelpunkt', [4, 1, '040']],
       ['Niederlassungen', 'Doppelpunkt', [4, 2, '1020']],
       ['Tabelle11', 'Notation', [0, 0, ':']],
       ['Tabelle11', 'Notation', [0, 1, ':']],
       ['Tabelle11', 'Spalte', [0, 2, '']]
       ]

result_dict = {'Niederlassungen': {'Spalte': [[4, 0, '']],
                                   'Doppelpunkt': [[4, 1, '040'], [4, 2, '1020']]
                                   },
               'Tabelle11': {'Notation': [[0, 0, ':'], [0, 1, ':']],
                             'Spalte': [[0, 2, '']]
                             }
               }
print(result_dict)
print('---')

fail_dict = {}
# fail_dict['dict1'] = {}
# fail_dict['dict1']['innerkey'] = 'value'

for lst_element in lst:
    sheet = lst_element[0]
    fail_name = lst_element[1]
    fail_values = lst_element[2]
    if sheet not in fail_dict.keys():
        fail_dict[sheet] = {}
        if fail_name not in fail_dict.values():
            fail_dict[sheet][fail_name] = fail_values
    else:
        if fail_name not in fail_dict[sheet].values():
            fail_dict[sheet][fail_name] = fail_values
        else:
            fail_dict[sheet][fail_name].append(fail_values)
        
print(fail_dict)
Any help?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Je nach Python-Version musst du dafuer explizit OrderedDict nehmen. Spaetere (ab 3.6 oder 3.7? Muesste ich nachschauen) haben das implizit.

Code: Alles auswählen

import pprint
from collections import OrderedDict

lst = [['Niederlassungen', 'Spalte', [4, 0, '']],
       ['Niederlassungen', 'Doppelpunkt', [4, 1, '040']],
       ['Niederlassungen', 'Doppelpunkt', [4, 2, '1020']],
       ['Tabelle11', 'Notation', [0, 0, ':']],
       ['Tabelle11', 'Notation', [0, 1, ':']],
       ['Tabelle11', 'Spalte', [0, 2, '']]
       ]



od = OrderedDict()

for a, b, v in lst:
    subdict = od.setdefault(a, OrderedDict())
    values = subdict.setdefault(b, [])
    values.append(v)

pprint.pprint(od)
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Du schaust ja in der zweiten Ebene ob der Value schon existiert und nicht der Schllüssel.

Code: Alles auswählen

for sheet, fail_name, fail_value in lst:
    if sheet not in fail_dict:
        fail_dict[sheet] = {}
    if fail_name not in fail_dict[sheet]:
        fail_dict[sheet][fail_name] = []
    fail_dict[sheet][fail_name].append(fail_values) 
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Verdammt, wie einfach, wenn man die Lösung sieht.
Danke. Wußte auch nicht, daß es sowas wie pprint gibt.
DANKE MÄDELS :)
Antworten