Transformacija 2D niza u 1D niz, proces poznat kao izravnavanje, predstavlja uobičajeni zadatak u programiranju. Postoji nekoliko pristupa za rešavanje ovog izazova.
U ovom vodiču, istražićemo neke od najčešće korišćenih metoda.
Pogledajmo na primeru kako se to radi.
Ulaz:
[[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]
Izlaz:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#1. Korišćenje petlji
Najdirektniji pristup za rešavanje ovog problema je iteracija kroz nizove, odnosno, korišćenje petlji. Verovatno većina vas je upoznata s ovim pristupom. Hajde da detaljnije razmotrimo korake za njegovo implementiranje.
- Prvo, inicijalizujemo listu listi sa proizvoljnim podacima, koju ćemo nazvati „podaci“.
- Zatim, kreiramo praznu listu, nazvanu „izravnana_lista“, u koju ćemo smestiti izravnane elemente.
- Iteriramo kroz „podaci“ listu.
- Za svaku podlistu, raspakujemo sve njene elemente.
- Svaki raspakovani element dodajemo u „izravnana_lista“ korišćenjem metode za dodavanje elemenata u listu.
- Na kraju, štampamo rezultat, odnosno „izravnana_lista“.
U nastavku je prikazan kod koji implementira ovaj pristup.
# inicijalizacija podataka i prazne liste podaci = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]] izravnana_lista = [] # iteracija kroz podaci for element in podaci: # dodavanje elemenata u izravnanu_lista izravnana_lista += element # štampanje rezultujuće izravnane liste print(izravnana_lista)
Umesto operatora spajanja (+=), možemo koristiti drugu petlju za dodavanje elemenata podlisti u „izravnana_lista“. Takođe, možemo primeniti i list comprehension umesto klasičnih petlji.
Sve ove alternative postižu isti rezultat. Hajde da pogledamo sledeću metodu za rešavanje problema.
#2. Upotreba `itertools.chain`
U ovom pristupu, koristićemo funkciju `chain` iz ugrađenog modula `itertools`.
`chain` metoda prolazi kroz svaku podlistu i vraća njene elemente dok se ne iscrpe sve podliste. Rezultat je iterabilni objekat, koji moramo konvertovati u listu.
Pogledajmo korake potrebne za implementiranje ovog rešenja.
- Inicijalizujemo listu listi sa proizvoljnim podacima i imenujemo je „podaci“.
- Kreiramo iterabilni objekat pomoću funkcije `itertools.chain(*podaci)`, koji sadrži sve elemente iz svih podlisti.
- Konvertujemo dobijeni iterabilni objekat u listu.
- Ispisujemo rezultujuću izravnanu listu.
Kod koji demonstrira ovaj pristup, nalazi se u nastavku.
# uvoz modula import itertools # inicijalizacija podataka podaci = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]] # izravnavanje liste i čuvanje rezultata izravnana_lista = itertools.chain(*podaci) # konvertovanje iterabilnog objekta u listu i štampanje print(list(izravnana_lista))
#3. Izravnavanje višeslojnih listi
Prethodno smo videli kako se izravnava lista listi. Međutim, gore navedene metode neće funkcionisati za izravnavanje lista koje su višeslojne, odnosno, kada liste sadrže druge liste kao elemente. Razmotrimo sledeći primer:
Ulaz:
[1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]
Izlaz:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Pošto unapred ne znamo dubinu lista, moramo koristiti rekurziju za rešavanje ovog problema.
- Inicijalizujemo podatke kao u datom primeru i nazovemo ih „podaci“.
- Inicijalizujemo praznu listu, nazvanu „izravnana_lista“.
- Definišemo funkciju, nazvanu „izravnaj_listu“.
- Prolazimo kroz elemente date liste.
- Ako je element lista, rekurzivno pozivamo istu funkciju sa tim elementom kao novim argumentom.
- Ako element nije lista, dodajemo ga u „izravnana_lista“.
- Pozivamo funkciju sa „podaci“ kao argumentom.
- Funkcija će popuniti „izravnana_lista“ svim elementima.
- Štampamo „izravnana_lista“ da proverimo rezultat.
Wow! Dosta koraka za kodiranje. Bez brige, pretvaranje navedenih koraka u kod ne bi trebalo da traje duže od jednog minuta.
# inicijalizacija podataka i prazne liste podaci = [1, [2, 3, [4, 5]], 6, [[7], [8, 9]]] izravnana_lista = [] # funkcija def izravnaj_listu(podaci): # iteracija kroz podatke for element in podaci: # provera da li je element lista if type(element) == list: # pozivanje iste funkcije sa trenutnim elementom kao novim argumentom izravnaj_listu(element) else: izravnana_lista.append(element) # izravnavanje date liste izravnaj_listu(podaci) # štampanje izravnane liste print(izravnana_lista)
Bitno je napomenuti da nismo transformisali postojeću listu. Umesto toga, kreirali smo novu listu sa elementima iz date liste.
Zaključak
Nadam se da ste uživali u ovom vodiču. Postoji mnogo drugih načina da se lista izravna u Python-u, ali mislim da su gore navedeni jedni od najjednostavnijih za razumevanje i upotrebu.
Srećno kodiranje! 🙂