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

Převod 2D pole na 1D pole se nazývá zploštění. Existuje mnoho přístupů k řešení problému.

Některé z nich prozkoumáme v tomto tutoriálu.

Podívejme se na příklad.

Vstup

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

Výstup

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

#1. Smyčky

Nejběžnějším způsobem řešení problému je použití smyček. Myslím, že většina z vás už to pochopila. Podívejme se na kroky k vyřešení problému pomocí smyček.

  • Inicializujte seznam seznamů fiktivními daty a pojmenujte je jako data.
  • Nyní inicializujte prázdný seznam s názvem flat_list.
  • Opakujte data.
    • Rozbalte všechny prvky z aktuálního seznamu.
    • Přidejte je do flat_list pomocí metody list append.
  • Vytiskněte výsledek.

Podívejte se na kód problému níže.

# initializing the data and an empty list
data = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]
flat_list = []

# iterating over the data
for item in data:
    # appending elements to the flat_list
    flat_list += item

# printing the resultantn flat_list
print(flat_list)

K přidání prvků podseznamu do flat_list můžete místo operátoru zřetězení použít jinou smyčku. Místo smyček můžeme také použít porozumění seznamu.

Oba dělají stejnou práci. Podívejme se na další způsob řešení problému.

#2. Itertools – Řetěz

Použijeme metodu nazvanou chain z vestavěného modulu itertools.

Řetězec metod iteruje přes každý podseznam a vrací prvky, dokud v něm nejsou žádné podseznamy. Vrací iterovatelnou, kterou musíme převést na seznam.

Podívejme se na kroky při řešení problému.

  • Inicializujte seznam seznamů fiktivními daty a pojmenujte je jako data.
  • Získejte iterovatelný flatten pomocí itertools.chain(*data).
  • Převeďte výslednou iterovatelnou do seznamu.
  • Vytiskněte srovnávací seznam.

Můžete si projít kód v níže uvedeném úryvku.

# importing the module
import itertools

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

# flattening the list and storing the result
flat_list = itertools.chain(*data)

# converting iterable to list and printing
print(list(flat_list))

#3. Vyrovnat víceúrovňové seznamy

Viděli jsme, jak zploštit seznam seznamů. Výše uvedené metody, které jsme probrali pro sloučení seznamu, nebudou fungovat pro víceúrovňové seznamy. Podívejme se na příklad.

Vstup

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

Výstup

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

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

  • Inicializujte data podle příkladu a pojmenujte je jako data.
  • Inicializujte prázdný seznam s názvem flat_list.
  • Napište funkci s názvem flatten_list.
    • Iterujte prvky daného seznamu.
    • Pokud je prvkem seznam, pak rekurzivně zavolejte stejnou funkci znovu.
    • Pokud prvek není seznam, přidejte prvek do flat_list.
  • Vyvolejte funkci s daty.
  • Funkce vyplní všechny prvky v seznamu flat_list.
  • Vytiskněte flat_list a zkontrolujte výstup.

Fuj! mnoho kroků ke kódování. Nebojte se. Převod výše uvedených příkazů na kód nebude trvat déle než minut.

# initializing the data and empty list
data = [1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]
flat_list = []

# function
def flatten_list(data):
    # iterating over the data
    for element in data:
        # checking for list
        if type(element) == list:
            # calling the same function with current element as new argument
            flatten_list(element)
        else:
            flat_list.append(element)

# flattening the given list
flatten_list(data)

# printing the flat_list
print(flat_list)

Nezapomeňte, že jsme nepřevedli existující seznam. Místo toho jsme vytvořili nový seznam s daným prvkem seznamu.

Závěr

Doufám, že se vám výukový program líbil. V Pythonu může být mnoho dalších způsobů, jak seznam zploštit, ale cítil jsem, že výše uvedené jsou pravděpodobně ty nejjednodušší.

Veselé kódování 🙂