Forum » Programiranje » [Python3] Sortiranje 2D dict-a?
[Python3] Sortiranje 2D dict-a?
ZGI ::
Zdravo.
Potrebujem pomoč pri sortiranju 2D dict-a. Dict izgleda takole:
{"L1DGA9": {"termin": "2019-2-2 6:30:0", "name": "Ime Priimek"},
"EKSISG": {"termin": "2019-2-2 6:30:1", "name": "Ime Priimek"},
"85CM4U": {"termin": "2019-2-2 6:30:2", "name": "Ime Priimek"}}
Rad bi ga sortiral po terminu oz timestampu.
Potrebujem pomoč pri sortiranju 2D dict-a. Dict izgleda takole:
{"L1DGA9": {"termin": "2019-2-2 6:30:0", "name": "Ime Priimek"},
"EKSISG": {"termin": "2019-2-2 6:30:1", "name": "Ime Priimek"},
"85CM4U": {"termin": "2019-2-2 6:30:2", "name": "Ime Priimek"}}
Rad bi ga sortiral po terminu oz timestampu.
Tajiti zmoto, je dvojna zmota.
neverlucky ::
Ti bi te podatke na koncu se zmeraj imel rad v slovarju? Kolikor imam izkusenj z najnovejsimu Pythoni, bodo kljuci v slovarju razporejeni po tem kdaj so bili dodani v slovar. Tako da ena opcija je, da podatke preberes iz slovarja, jih uredis in nato po vrsti glede na termin vstavis v nek slovar.
Ce pa zelis imeti samo nek pregled po terminih pa naredi:
Zapelji se po vse kljucih v slovarju in v list dodajaj tuple oblike ( termin, ime in priimek, sifra).
Ta list nato sortiras in imas vse vrednosto razvrscene glede na termin.
Ce ne razumes, ti lahko kasneje pokazem na primeru.
Ce pa zelis imeti samo nek pregled po terminih pa naredi:
Zapelji se po vse kljucih v slovarju in v list dodajaj tuple oblike ( termin, ime in priimek, sifra).
Ta list nato sortiras in imas vse vrednosto razvrscene glede na termin.
Ce ne razumes, ti lahko kasneje pokazem na primeru.
neverlucky ::
slovar = { "L1DGA9" : { "termin" : "2019-2-2 6:30:0", "name" : "Ime Priimek" }, "EKSISG" : { "termin" : "2019-2-2 6:30:1", "name" : "Ime Priimek" }, "85CM4U" : { "termin" : "2019-2-2 6:30:2", "name" : "Ime Priimek" } } sortirani_podatki = [] for sifra in slovar: termin = slovar[sifra]["termin"] ime = slovar[sifra]["name"] sortirani_podatki.append((termin, ime, sifra)) sortirani_podatki.sort() for element in sortirani_podatki: print(element)
LenartB ::
Lahko tudi uporabiš library SQLAlchemy (LINK), kjer lahko ustvariš SQLite bazo iz tvojega dicta v tvoji skripti ter nato z SQL queriji sortiraš\urejaš podatke.
Isotropic ::
v starejših pythonih imaš tudi opcijo OrderedDict, potem pa postopaš podobno kot neverlucky
zaj_tam ::
Ponavadi bi dal vrednosti, po katerih zelis sortirat, v kljuc slovarja. V tvojem primeru to mogoce ni najbolj elegantno.
Druga opcija bi bila, da uporabis metodo .items() na slovarju, kar ti da seznam tuplov, tisto pa potem sortiras. Funkcija sorted() v pythonu ti omogoca, da izberes funkcijo, ki definira kako se sortira.
5 sekund googlanja najde tole, kar je imho najboljsa varjanta zate. Ena vrstica kode, ki se bo izvedla veliko hitreje, kot ce pises for zanke, kot predlagajo so-forumasi zgoraj :)
Seznam tuplov je tudi zelo enostavno pretvoriti nazaj v slovar.
Seveda ce operiras z veliko zapisi in bos tole konverzijo delal pogosto se splaca razmisliti o drugacnem formatu hranjenja podatkov.
(edit slovnica :)
Druga opcija bi bila, da uporabis metodo .items() na slovarju, kar ti da seznam tuplov, tisto pa potem sortiras. Funkcija sorted() v pythonu ti omogoca, da izberes funkcijo, ki definira kako se sortira.
5 sekund googlanja najde tole, kar je imho najboljsa varjanta zate. Ena vrstica kode, ki se bo izvedla veliko hitreje, kot ce pises for zanke, kot predlagajo so-forumasi zgoraj :)
Seznam tuplov je tudi zelo enostavno pretvoriti nazaj v slovar.
Seveda ce operiras z veliko zapisi in bos tole konverzijo delal pogosto se splaca razmisliti o drugacnem formatu hranjenja podatkov.
(edit slovnica :)
Zgodovina sprememb…
- spremenil: zaj_tam ()
neverlucky ::
Uporabi to, kar je napisal zaj_tam. Je veliko lepše, krajše in nekaj hitreje. Sem malo potestiral in recimo za slovar velikosti 5*10^6 so takšni timingi:
14.280675649642944
8.625980377197266
14.280675649642944
8.625980377197266
Zgodovina sprememb…
- spremenil: neverlucky ()
ZGI ::
Naceloma sem resil priblizno tako kot si omenil.
Bom pa probal "one liner" kot je omenil zaj_tam.
Hvala
Bom pa probal "one liner" kot je omenil zaj_tam.
Hvala
neverlucky je izjavil:
Uporabi to, kar je napisal zaj_tam. Je veliko lepše, krajše in nekaj hitreje. Sem malo potestiral in recimo za slovar velikosti 5*10^6 so takšni timingi:
14.280675649642944
8.625980377197266
Tajiti zmoto, je dvojna zmota.
marska83 ::
Mogoče lahko tudi kaj takega:
def sorter(mydict): def sorter_by_date(elem): return mydict[elem]['termin'] for e in sorted(mydict.keys(), key=sorter_by_date): print(mydict[e]) sorter(slovar)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | program, ki ti najde vse kombinacije črk oz. številk, ki mu jih podaš (strani: 1 2 )Oddelek: Programiranje | 41749 (6441) | XyNOBvxWVJ |
» | python-rabim pomočOddelek: Programiranje | 2758 (988) | rnla1973 |
» | Python - pomoč (strani: 1 2 3 )Oddelek: Programiranje | 17934 (8682) | black ice |
» | A kdo ve narediti navedeno - izdelava SLO-ANG za KOBO Aura ereaderOddelek: Programiranje | 1852 (1259) | Joze_K |
» | [Java]: replace - slovar v txtOddelek: Programiranje | 1683 (1541) | Spura |