Průvodce sloučit seznam a seznam seznamů v Pythonu

Photo of author

By etechblogcz

Transformace dvourozměrného pole na jednorozměrné, známá také jako zploštění, představuje běžný programátorský úkol. Existuje celá řada metod, jak se s tímto problémem vypořádat.

V tomto návodu se podíváme na některé z těchto přístupů.

Začněme příkladem:

Vstupní data:

[[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]

Očekávaný výstup:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#1. Cykly

Nejzákladnější a často používanou technikou je využití cyklů. Předpokládám, že většina z vás již tuší, jak na to. Pojďme si krok za krokem projít, jak problém vyřešit s pomocí cyklů.

  • Nejprve si vytvoříme seznam seznamů s testovacími daty a pojmenujeme ho například `data`.
  • Dále si připravíme prázdný seznam, do kterého budeme ukládat zploštěná data, a nazveme ho `flat_list`.
  • Nyní iterujeme přes `data`.
    • Pro každý podseznam extrahujeme jeho prvky.
    • Tyto prvky postupně přidáváme do `flat_list` pomocí metody `append`.
  • Nakonec zobrazíme `flat_list` s výsledkem.

Podívejte se na následující kód:

# inicializace dat a prázdného seznamu
data = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]
flat_list = []

# procházení dat
for item in data:
    # přidávání prvků do flat_list
    flat_list += item

# výpis výsledného seznamu
print(flat_list)

Pro přidání prvků podseznamu do `flat_list` můžete namísto operátoru zřetězení použít vnitřní cyklus. Kromě toho lze cykly nahradit i pomocí tzv. list comprehension.

Obě metody dosahují stejného výsledku. Pojďme se podívat na další způsob, jak problém řešit.

#2. Modul Itertools – Funkce chain

Využijeme funkci `chain` z vestavěného modulu `itertools`.

Funkce `chain` prochází jednotlivé podseznamy a postupně vrací prvky, dokud neprojdou všechny. Vrací iterovatelný objekt, který je nutné převést na seznam.

Zde jsou kroky pro řešení problému:

  • Inicializujeme seznam seznamů s testovacími daty, nazvěme je opět `data`.
  • Získáme iterovatelný objekt `flatten` pomocí `itertools.chain(*data)`.
  • Převedeme iterovatelný objekt na seznam.
  • Vytiskneme zploštěný seznam.

Níže najdete příslušný kód:

# import modulu
import itertools

# inicializace dat
data = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]

# zploštění seznamu a uložení výsledku
flat_list = itertools.chain(*data)

# převod iterovatelného objektu na seznam a jeho výpis
print(list(flat_list))

#3. Zploštění víceúrovňových seznamů

Zatím jsme viděli, jak zploštit seznam seznamů. Výše uvedené metody, které jsme si ukázali pro sloučení seznamů, nebudou fungovat pro víceúrovňové seznamy. Podívejme se na následující příklad:

Vstup:

[1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]

Očekávaný výstup:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Protože předem neznáme hloubku seznamů, musíme k řešení tohoto problému použít rekurzi.

  • Inicializujeme `data` podle příkladu výše.
  • Vytvoříme prázdný seznam `flat_list`.
  • Definujeme funkci `flatten_list`.
    • Iterujeme přes prvky zadaného seznamu.
    • Pokud je prvek seznam, rekurzivně zavoláme funkci `flatten_list` s tímto prvkem.
    • Pokud prvek není seznam, přidáme ho do `flat_list`.
  • Zavoláme funkci `flatten_list` s `data`.
  • Funkce přidá všechny prvky do `flat_list`.
  • Vytiskneme `flat_list` a ověříme výsledek.

Ano, je to trochu kroků, než se dostaneme k samotnému kódu. Nemějte však obavy, převod popisu do kódu vám nezabere déle než minutu.

# inicializace dat a prázdného seznamu
data = [1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]
flat_list = []

# funkce
def flatten_list(data):
    # procházení dat
    for element in data:
        # kontrola, zda se jedná o seznam
        if type(element) == list:
            # rekurzivní volání funkce se stávajícím prvkem jako novým argumentem
            flatten_list(element)
        else:
            flat_list.append(element)

# zploštění daného seznamu
flatten_list(data)

# výpis flat_list
print(flat_list)

Je důležité poznamenat, že jsme nepřevedli existující seznam. Místo toho jsme vytvořili nový seznam s prvky původního seznamu.

Závěr

Doufám, že se vám tento návod líbil. V Pythonu existuje mnoho dalších způsobů, jak zploštit seznam, ale myslím, že výše uvedené jsou pravděpodobně ty nejjednodušší.

Přeji vám příjemné kódování 🙂