logo

Sloučit seznam v Pythonu

Úvod

A Seznam je považován za jednu z nejflexibilnějších datových struktur v programovacím jazyce Python. Na druhou stranu, dvourozměrný seznam nebo 2D seznam, který se obecně nazývá seznam seznamů, je objektem seznamu, kde každý prvek je seznam sám o sobě. Například: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].

Zploštění seznamu seznamů je proces transformace dvourozměrného seznamu na jednorozměrný seznam zrušením vnoření každého prvku seznamu uchovávaného v seznamu seznamů, tj. transformací [[9, 8, 7], [6 , 5, 4], [3, 2, 1]] až [9, 8, 7, 6, 5, 4, 3, 2, 1].

Proces zploštění můžeme provést pomocí vnořených pro smyčky, rekurze, porozumění seznamům, základní funkce nebo import knihoven nebo balíčků v Pythonu na hloubku a pravidelnost vnořených seznamů.

V tomto tutoriálu budeme pracovat na různých metodách, jak sloučit vnořené seznamy pomocí programovacího jazyka Python. Než však začneme, pojďme si porozumět typům vnořených seznamů.

Jaké jsou typy vnořených seznamů?

Jak víme, Krajta je slabě napsaný programovací jazyk. Proto se můžeme setkat se dvěma typy Seznamu seznamů. Tyto seznamy nebo vnořené seznamy jsou následující:

  1. Pravidelný seznam seznamů
  2. Nepravidelný seznam seznamů

Pravidelný seznam seznamů

Každá položka v běžném seznamu seznamů je označována jako dílčí seznam, čímž je dodržena jednotnost typu prvku. Například: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] je běžný seznam seznamů jako [9, 8, 7], [6, 5, 4] , [3, 2, 1] je typu seznam.

Nepravidelný seznam seznamů

řetězec v poli v c

Každá položka v nepravidelném seznamu seznamů je buď označována jako dílčí seznam nebo prvek mimo seznam (například řetězec nebo celé číslo). Existuje tedy nesrovnalost, pokud jde o typ prvku. Například: [[9, 8, 7], [6, 5], 4, 3] je nepravidelný seznam seznamů, protože [9, 8, 7] a [6, 5] jsou typů seznamů, zatímco 4 a 3 jsou typu int.

Sloučení seznamu seznamů pomocí funkce Nested for Loops

Zploštění seznamu seznamů s vnořenými pro Loopsova pomoc je považována za přístup hrubou silou k získání plochého seznamu. Tuto metodu můžeme provést tak, že vybereme každou položku z Dvojrozměrného seznamu a uspořádáme ji do Jednorozměrného seznamu.

Uvažujme následující příklad, který funguje jak pro běžné, tak pro nepravidelné seznamy.

Příklad:

 # defining the function def flattenlist(_2dlist): # defining an empty list flatlist = [] # Iterating through the outer list for item in _2dlist: if type(item) is list: # If the item is of the list type, iterating through the sub-list for element in item: flatlist.append(element) else: flatlist.append(item) return flatlist # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] print('Genuine List:', nestedlist) print('Converted Flat List:', flattenlist(nestedlist)) 

Výstup:

 Genuine List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] Converted Flat List: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

Vysvětlení:

Ve výše uvedeném příkladu jsme definovali funkci jako flattenlist který bere v parametru as _2dlist . Pak jsme použili pro smyčka pro iteraci prvků vnořeného seznamu a jejich připojení k vytvoření sloučeného seznamu. Poté jsme definovali vnořený seznam a implementovali jej flattenlist funkce. V důsledku toho se vnořený seznam úspěšně transformoval na sloučený seznam.

Zploštění vnořeného seznamu pomocí funkce List Comprehension

Sloučení seznamu seznamů pomocí funkce List Comprehension se považuje za elegantní přístup k získání plochého seznamu v závislosti na existujícím dvourozměrném seznamu. Tento přístup však nabízí méně intuitivní řešení.

Uvažujme o následujícím příkladu.

Příklad:

 # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # list comprehension flatlist = [element for sub_list in nestedlist for element in sub_list] print('Genuine list:', nestedlist) print('Converted list:', flatlist) 

Výstup:

 Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Vysvětlení:

Ve výše uvedeném příkladu jsme definovali vnořený seznam a porozumění seznamu. Poté jsme je vytiskli pro uživatele. Výsledkem je, že vnořený seznam byl úspěšně transformován na sloučený seznam.

Zploštění seznamu seznamů pomocí rekurzivní metody

K zploštění dvourozměrného seznamu můžeme také použít rekurzivní metodu. Podívejme se na následující příklad implementace rekurzivní metody, abychom seznam seznamů srovnali. Tato implementace funguje dobře pro běžný i nepravidelný seznam seznamů.

Příklad:

 # defining a function def flattenlist(nestedlist): if len(nestedlist) == 0: return nestedlist if isinstance(nestedlist[0], list): return flattenlist(nestedlist[0]) + flattenlist(nestedlist[1:]) return nestedlist[:1] + flattenlist(nestedlist[1:]) print(flattenlist([[10, 20, 30, 40], [50, 60, 70], [80, 90], 100])) 

Výstup:

 [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

Vysvětlení:

Ve výše uvedeném příkladu jsme definovali funkci a použili jsme an -li prohlášení s uvedením, zda je délka vnořeného seznamu rovna nule, pak vrátí vnořený seznam.

řetězcový formát java

Pokud je datový prvek na nultém indexu instancí seznamu, pak index seznamu přejde do funkce znovu a přidá se k následujícímu indexu seznamu a tak dále. Jinak funkce vrátí prvky a tak dále. Nakonec jsme definovali vnořený seznam a provedli funkci. V důsledku toho se seznam seznamů rekurzivně srovnal.

Využití knihoven Pythonu

Můžeme také použít některé z knihoven programovacího jazyka Python ke zploštění seznamu seznamů. Implementace těchto knihoven je popsána níže:

Sloučení seznamu seznamů pomocí functools a knihoven operátorů

The operátor knihovna poskytuje iconcat() funkce k provedení základní operace, jako je zřetězení. Tuto funkci můžeme aplikovat kumulativně na datové prvky vnořeného seznamu, zleva doprava, což vede k redukci vnořeného seznamu na sloučený seznam.

Podívejme se na následující příklad, abychom pochopili jeho implementaci.

Příklad:

 # importing the required libraries import operator import functools regularlist = [] # Converting the list of lists into a flattened one. def convo(nestedlist): for element in nestedlist: if type(element) is list: regularlist.append(element) else: regularlist.append([element]) return regularlist twoDlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] regular2Dlist = convo(twoDlist) print('Given List:', twoDlist) print('Converted list:', functools.reduce(operator.iconcat, regular2Dlist, [])) 

Výstup:

 Given List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] 

Vysvětlení:

Ve výše uvedeném příkladu jsme importovali functools knihovna spolu s operátor knihovna. Poté jsme definovali prázdný seznam jako pravidelný seznam . Poté jsme definovali funkci jako konvo transformovat seznam seznamů na sloučený seznam. V této funkci jsme použili pro smyčka, kde jsou prvky z vnořeného seznamu připojeny k prázdnému seznamu, který jsme definovali dříve. Později jsme definovali vnořený seznam a provedli funkci. V důsledku toho je seznam seznamů úspěšně převeden na sloučený seznam.

Sloučení seznamu seznamů pomocí knihovny itertools

The itertools knihovna poskytuje řetěz() funkce, která nám v ideálním případě umožňuje transformovat vnořený seznam na jediný sloučený seznam. Tato funkce zachází s po sobě jdoucími řadami jako s jednou sérií tím, že je iteruje přes iterovatelnou předávanou jako parametr sériovým způsobem.

Uvažujme o následujícím příkladu:

Příklad:

 # importing the itertools library import itertools # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] flattenlist = list(itertools.chain(*nestedlist)) print('The nested list:', nestedlist) print('The flattened list:', flattenlist 

Výstup:

 The nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] The flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

Vysvětlení:

Ve výše uvedeném příkladu jsme importovali itertools knihovny a vygeneroval vnořený seznam. Poté jsme použili řetěz() funkce pro převod daného vnořeného seznamu na sloučený seznam. Nakonec jsme výsledek vrátili uživatelům. V důsledku toho je seznam seznamů úspěšně sloučen.

Sloučení seznamu seznamů pomocí knihovny NumPy

převést řetězec na int java

The NumPy knihovna poskytuje různé každodenní operace, včetně zřetězení dvourozměrných pravidelných polí po sloupcích nebo řádcích. Použijeme atribut známý jako byt s cílem dostat přes pole jednorozměrný iterátor k dobytí cíle. Podívejme se na následující příklad, abychom pochopili použití funkce zřetězení a atributu flat.

Příklad:

 # importing the library import numpy # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the concatenate function along with the flat attribute flattenlist = list(numpy.concatenate(nestedlist).flat) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

Výstup:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Vysvětlení:

Ve výše uvedeném příkladu jsme importovali nemotorný knihovny a definoval vnořený seznam. Poté jsme použili zřetězit funkce nemotorný knihovna spolu s ní byt atribut pro sloučení prvků vnořeného seznamu a jejich zřetězení do nového sloučeného seznamu. Konečně jsme pro uživatele vytiskli výsledek. Seznam seznamů je tedy úspěšně sloučen.

Využití základních funkcí

Úlohu zploštění můžeme provést také využitím některých základních funkcí, které poskytuje programovací jazyk Python.

Zploštění seznamu seznamů pomocí funkce součtu

Za další řešení problému můžeme považovat sčítání přes vnitřní seznamy. Předáme dva argumenty součet funkce: První parametr je iterovatelné , což je vnořený seznam, a druhý parametr je Start což je prázdný seznam pro následující případ, který slouží jako počáteční plochý seznam, kam se přidají datové prvky vnitřních dílčích seznamů.

Můžeme říci, že tento přístup je docela pohodlný, protože nemusíme nic importovat. Je však pomalejší než itertools() a řetěz() funguje, když je ve vnořeném seznamu přítomen velký počet dílčích seznamů.

Uvažujme o následujícím příkladu:

Příklad:

 # defining a nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the sum function flattenlist = sum(nestedlist, []) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

Výstup:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Vysvětlení:

Ve výše uvedeném příkladu jsme definovali vnořený seznam. Poté jsme použili součet() a sloučil vnořený seznam do jednorozměrného seznamu a vytiskl výsledný seznam pro uživatele. V důsledku toho jsme úspěšně transformovali seznam seznamů na plochý seznam.

Zploštění seznamu seznamů pomocí klíčového slova Lambda

Anonymní funkci můžeme definovat pomocí klíčového slova lambda . Pravidelný/nepravidelný seznam můžeme předat jako parametr této anonymní funkci. Vyhodnocení výrazu se provádí za účelem získání plochého Jednorozměrného seznamu.

Uvažujme o následujícím příkladu:

Příklad:

 # Defining the nested list nestedlist = [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] # Using lambda parameters: expression flattenlist = lambda nestedlist:[item for element in nestedlist for item in flattenlist(element)] if type(nestedlist) is list else [nestedlist] print('The Nested list:', nestedlist) print('The Flattened List:', flattenlist(nestedlist)) 

Výstup:

 The Nested list: [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] The Flattened List: [10, 20, 30, 30, 50, 60, 40, 60, 70, 70] 

Vysvětlení:

python nový řádek

Ve výše uvedeném příkladu jsme definovali vnořený seznam. Poté jsme použili lambda klíčové slovo spolu s argumentem definujícím výraz pro porozumění seznamu. Poté jsme je vytiskli pro uživatele. V důsledku toho jsme úspěšně převedli Dvourozměrný nepravidelný seznam na zploštělý seznam.