logo

Appiattisci elenco in Python

Un introduzione

UN Elenco è considerata una delle strutture dati più flessibili nel linguaggio di programmazione Python. D'altra parte, una lista bidimensionale, o lista 2D, generalmente definita lista di liste, è un oggetto di una lista in cui ogni elemento è esso stesso una lista. Ad esempio: [[19, 18, 17], [16, 15, 14], [13, 12, 11]].

L'appiattimento di un elenco di elenchi è un processo di trasformazione di un elenco bidimensionale in un elenco unidimensionale disannidando ogni elemento dell'elenco mantenuto nell'elenco di elenchi, ovvero trasformando [[9, 8, 7], [6 , 5, 4], [3, 2, 1]] a [9, 8, 7, 6, 5, 4, 3, 2, 1].

Possiamo eseguire il processo di appiattimento con l'aiuto del nidificato per loop, ricorsione, comprensione di elenchi, funzioni principali o importazione di librerie o pacchetti in Python sulla profondità e regolarità degli elenchi nidificati.

In questo tutorial, lavoreremo su vari metodi per appiattire gli elenchi nidificati utilizzando il linguaggio di programmazione Python. Ma prima di iniziare, cerchiamo di comprendere i tipi di elenchi nidificati.

Quali sono i tipi di elenchi nidificati?

Come sappiamo, Pitone è un linguaggio di programmazione debolmente tipizzato. Pertanto, possiamo incontrare due tipi di Elenco di elenchi. Questi elenchi di elenchi o elenchi nidificati sono i seguenti:

  1. Elenco regolare degli elenchi
  2. Elenco irregolare di elenchi

Elenco regolare degli elenchi

Ciascun elemento della Lista Regolare delle liste viene denominato Sotto-Lista, rispettando così l'uniformità della tipologia dell'elemento. Ad esempio: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] è un elenco regolare di elenchi come [9, 8, 7], [6, 5, 4] , [3, 2, 1] è del tipo elenco.

Elenco irregolare di elenchi

delizia soleggiata

Ogni elemento nell'elenco irregolare degli elenchi viene indicato come sottoelenco o elemento non elenco (ad esempio, una stringa o un numero intero). Pertanto, esiste un'irregolarità in termini di tipo di elemento. Ad esempio: [[9, 8, 7], [6, 5], 4, 3] è un elenco irregolare di elenchi poiché [9, 8, 7] e [6, 5] sono dei tipi di elenco, mentre 4 e 3 sono di tipo int.

Appiattimento dell'elenco di elenchi utilizzando i cicli Nested for

Appiattimento dell'elenco di elenchi con Nested per L'aiuto dei loop è considerato un approccio di forza bruta per ottenere un elenco piatto. Possiamo eseguire questo metodo selezionando ciascun elemento dall'elenco bidimensionale e disponendolo in un elenco unidimensionale.

Consideriamo il seguente esempio che funziona sia per elenchi di elenchi regolari che irregolari.

Esempio:

 # 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)) 

Produzione:

 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] 

Spiegazione:

Nell'esempio sopra, abbiamo definito una funzione come flattenlist che accetta un parametro come _2dlist . Abbiamo quindi utilizzato per loop per ripetere gli elementi dell'elenco nidificato e aggiungerli per generare un elenco appiattito. Abbiamo quindi definito l'elenco nidificato e implementato il file flattenlist funzione. Di conseguenza, l'elenco nidificato è stato trasformato con successo nell'elenco appiattito.

Appiattimento della lista nidificata utilizzando una comprensione della lista

Appiattire l'elenco degli elenchi con l'aiuto di una comprensione delle liste è considerato un approccio elegante per ottenere un elenco piatto che dipende da un elenco bidimensionale esistente. Tuttavia, questo approccio offre una soluzione meno intuitiva.

Consideriamo il seguente esempio.

Esempio:

 # 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) 

Produzione:

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

Spiegazione:

Nell'esempio precedente, abbiamo definito una lista nidificata e una comprensione della lista. Li abbiamo poi stampati per gli utenti. Di conseguenza, l'elenco nidificato è stato trasformato correttamente nell'elenco appiattito.

Appiattimento dell'elenco di elenchi utilizzando il metodo ricorsivo

Possiamo anche utilizzare il metodo ricorsivo per appiattire l'elenco bidimensionale. Consideriamo il seguente esempio che implementa il metodo ricorsivo per appiattire l'elenco delle liste. Questa implementazione funziona bene per elenchi di elenchi regolari e irregolari.

Esempio:

 # 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])) 

Produzione:

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

Spiegazione:

Nell'esempio precedente, abbiamo definito una funzione e utilizzato an Se dichiarazione indicando se la lunghezza dell'elenco nidificato è uguale a zero, quindi restituisce l'elenco nidificato.

stringa.formato java

Se l'elemento dati sull'indice zero è un'istanza di una lista, l'indice della lista entra nuovamente nella funzione e si aggiunge all'indice successivo della lista e così via. Altrimenti la funzione restituirà gli elementi e così via. Alla fine abbiamo definito l'elenco annidato ed eseguito la funzione. Di conseguenza, l'elenco degli elenchi si è appiattito in modo ricorsivo.

Utilizzo delle librerie di Python

Possiamo anche utilizzare alcune delle librerie del linguaggio di programmazione Python per appiattire l'elenco degli elenchi. L'implementazione di queste librerie è descritta di seguito:

Appiattimento dell'elenco di elenchi utilizzando i functools e le librerie degli operatori

IL operatore la biblioteca fornisce il file iconagatto() funzione per eseguire l'operazione fondamentale come la concatenazione. Possiamo applicare questa funzione cumulativamente agli elementi di dati di un elenco annidato, da sinistra a destra, ottenendo la riduzione dell'elenco annidato in un elenco appiattito.

Consideriamo il seguente esempio per comprenderne l'implementazione.

Esempio:

 # 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, [])) 

Produzione:

 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] 

Spiegazione:

Nell'esempio sopra, abbiamo importato il file funtools biblioteca insieme a operatore biblioteca. Abbiamo quindi definito una lista vuota come listaregolare . Abbiamo quindi definito una funzione come convo per trasformare l'elenco degli elenchi in un elenco appiattito. In questa funzione abbiamo utilizzato il file per ciclo in cui gli elementi dell'elenco nidificato vengono aggiunti all'elenco vuoto definito in precedenza. Successivamente abbiamo definito l'elenco annidato ed eseguito la funzione. Di conseguenza, l'elenco degli elenchi viene convertito correttamente in un elenco appiattito.

Appiattimento dell'elenco di elenchi utilizzando la libreria itertools

java converte la stringa in int

IL itertools la biblioteca fornisce il file catena() funzione che ci permette di trasformare idealmente una lista annidata in un'unica lista appiattita. Questa funzione tratta le serie consecutive come una singola serie iterandole tramite l'iterabile passato come parametro in modo seriale.

Consideriamo il seguente esempio:

Esempio:

 # 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 

Produzione:

 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] 

Spiegazione:

Nell'esempio sopra, abbiamo importato il file itertools libreria e generato un elenco nidificato. Abbiamo quindi utilizzato il catena() funzione per convertire l'elenco annidato specificato nell'elenco appiattito. Alla fine, abbiamo restituito il risultato agli utenti. Di conseguenza, l'elenco degli elenchi viene appiattito correttamente.

Appiattimento dell'elenco di elenchi utilizzando la libreria NumPy

IL NumPy La libreria fornisce varie operazioni quotidiane, inclusa la concatenazione di array regolari bidimensionali per colonna o per riga. Utilizzeremo l'attributo noto come Piatto per ottenere un iteratore unidimensionale sull'array per conquistare il bersaglio. Consideriamo l'esempio seguente per comprendere l'uso della funzione concatenata e dell'attributo flat.

Esempio:

 # 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) 

Produzione:

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

Spiegazione:

Nell'esempio sopra, abbiamo importato il file insensato libreria e definito un elenco annidato. Abbiamo quindi utilizzato il concatenare funzione del insensato libreria insieme al suo Piatto attributo per appiattire gli elementi dell'elenco nidificato e concatenarli in un nuovo elenco appiattito. Alla fine, abbiamo stampato il risultato per gli utenti. Pertanto, l'elenco degli elenchi viene appiattito correttamente.

Utilizzo delle funzioni principali

Possiamo anche eseguire l'attività di appiattimento utilizzando alcune funzioni principali fornite dal linguaggio di programmazione Python.

Appiattimento dell'elenco di elenchi utilizzando la funzione di somma

Possiamo considerare la somma su elenchi interni come un'altra soluzione al problema. Passiamo due argomenti al somma funzione: il primo parametro è iterabile , che è un elenco nidificato, e il secondo parametro è inizio che è un elenco vuoto per il caso successivo che funge da elenco piatto iniziale in cui verranno aggiunti gli elementi di dati dei sottoelenchi interni.

Possiamo dire che questo approccio è abbastanza conveniente poiché non dobbiamo importare nulla. Tuttavia, è più lento del itertools() E catena() funziona quando è presente un gran numero di sottoelenchi nell'elenco nidificato.

Consideriamo il seguente esempio:

Esempio:

 # 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) 

Produzione:

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

Spiegazione:

Nell'esempio precedente, abbiamo definito l'elenco nidificato. Abbiamo quindi utilizzato il somma() funzione e ha appiattito l'elenco nidificato in un elenco unidimensionale e ha stampato l'elenco risultante per gli utenti. Di conseguenza, abbiamo trasformato con successo l'elenco degli elenchi in un elenco piatto.

Appiattimento dell'elenco di elenchi utilizzando la parola chiave Lambda

codici colore Java

Possiamo definire una funzione anonima utilizzando la parola chiave lambda . Possiamo passare l'elenco regolare/irregolare come parametro a questa funzione anonima. La valutazione dell'espressione viene effettuata in modo da ottenere una Lista Unidimensionale piatta.

Consideriamo il seguente esempio:

Esempio:

 # 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)) 

Produzione:

 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] 

Spiegazione:

Nell'esempio precedente, abbiamo definito un elenco nidificato. Abbiamo quindi utilizzato il lambda parola chiave insieme a un argomento che definisce un'espressione per la comprensione dell'elenco. Li abbiamo poi stampati per gli utenti. Di conseguenza, abbiamo convertito con successo la Lista irregolare bidimensionale nella Lista appiattita.