» »

[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.
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.

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 :)

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

Zgodovina sprememb…

ZGI ::

Naceloma sem resil priblizno tako kot si omenil.

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.

Isotropic ::

lahko uporabiš tudi list kot index slovarja ja. prvega potem lahko po želji sortiraš.

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

program, ki ti najde vse kombinacije črk oz. številk, ki mu jih podaš (strani: 1 2 )

Oddelek: Programiranje
7041826 (6518) XyNOBvxWVJ
»

python-rabim pomoč

Oddelek: Programiranje
162773 (1003) rnla1973
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10318018 (8766) black ice
»

A kdo ve narediti navedeno - izdelava SLO-ANG za KOBO Aura ereader

Oddelek: Programiranje
111861 (1268) Joze_K
»

[Java]: replace - slovar v txt

Oddelek: Programiranje
121691 (1549) Spura

Več podobnih tem