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