Водич за изравнавање листе и листе листа у Питхон-у

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! 🙂