Modulo Raccolte Python: Counter, ChainMap, Deque e Tuple
Pubblicato: 2020-12-01Il modulo Raccolte Python offre un set di tipi di dati contenitore che estendono le funzionalità dei contenitori di stock come elenchi, tuple, set e dizionari. Con questi contenitori speciali, non hai solo le caratteristiche dei contenitori di scorta, ma anche alcuni metodi extra che sono molto utili per determinati compiti.
Alla fine di questo tutorial, avrai la conoscenza di quanto segue:
- Che cos'è il modulo delle raccolte?
- Varie funzioni come:
- Contatore
- ChainMap
- Deque
- Tupla denominata
- Esempi di lavoro
Il modulo Raccolte viene preinstallato in Python, quindi non è necessario installarlo tramite pip. Possiamo semplicemente importarlo e sei pronto per partire! Entriamo nel dettaglio delle funzioni più utilizzate.
Impara impara la scienza dei dati dalle migliori università del mondo. Guadagna programmi Executive PG, programmi di certificazione avanzati o programmi di master per accelerare la tua carriera.
Da leggere: affascinanti applicazioni Python nel mondo reale
Sommario
Contatore
Il Contatore è facilmente la funzione più utilizzata e più utile nel modulo Raccolte. Counter è una sottoclasse della classe dizionario in Python. Conta il numero di occorrenze di ogni elemento in un iterabile (come stringhe, tuple, elenchi, ecc.) e lo memorizza in un dizionario. Le chiavi del dizionario sono gli elementi univoci nell'iterabile ei valori sono i conteggi di tali elementi.
Proviamo con alcuni esempi.
Importa raccolte Marvel = 'Bad Wolverine ha maltrattato il povero Iron Man Bad Wolverine, il povero povero Iron Man' Marvel_count = collezioni.Contatore(Marvel.split()) |
#Produzione: Contatore({ 'Cattivo' : 3 , 'Ferro' : 2 , 'Uomo' : 2 , 'Poveri' : 2 , 'Wolverine' : 2 , 'prepotente' : 1 }) |
Come vediamo, ha contato le occorrenze di ogni elemento e le ha inserite in un dizionario. Questo può essere utilizzato in qualsiasi tipo di iterabile. Ora vediamo quali sono tutti i metodi che ha.
Marvel_count[ 'Cattivo' ] #>> 3 Marvel_count.values() #>> dict_values([3, 2, 1, 2, 2, 2]) Marvel_count.keys() #>> dict_keys(['Bad', 'Wolverine', 'Bullied', 'Iron', 'Man', 'Poveri']) |
Il metodo most_common(n) restituisce un elenco degli n elementi più comuni disposti in ordine decrescente di conteggio.
Marvel_count.most_common( 2 ) #>> [('Cattivo', 3), ('Golverine', 2)] |
ChainMap
ChainMap viene utilizzato per creare un'unica vista di molti dizionari in modo che sia possibile accedervi e aggiornarli dalla singola vista, ad esempio l'oggetto ChainMap stesso. Tieni presente che queste ChainMaps consistono solo nei riferimenti ai dizionari effettivi e l'aggiornamento viene eseguito anche nei dizionari stessi.
ChainMap è un'estensione della classe del dizionario, quindi tutti i metodi del dizionario sono supportati, oltre ad alcuni metodi extra che esamineremo.
dic1 = { 'a' : 1 , 'b' : 2 } dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 } chain1 = collezioni.ChainMap(dic2, dic1) catena1 |
Nel codice sopra, definiamo due dizionari dic1 e dic2 e li inseriamo in un oggetto ChainMap.
#Produzione: ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }) |
Come vediamo, dic2 è 'incatenato' con dic1 proprio in questo ordine. In sostanza, puoi immaginare dic2 collegato a dic1 come dic2–>dic1. Quindi, quando cerchiamo la chiave 'b', cercherà prima nella prima mappatura che è dic2 e se la chiave non viene trovata, andrà alle mappature successive.
Pertanto, l'ordine della ChainMap è importante per determinare quale mappatura viene cercata per prima. Vediamolo in azione.
catena1[ 'b' ] #>> 3 |
Come vediamo sopra ChainMap ha la chiave 'b' in entrambi i dizionari. Quindi, quando cerchiamo la chiave 'b', cerca nella prima mappatura che è dic2 e restituisce il valore.
attributo mappe
L'attributo mappe ChainMap restituisce un elenco di mappature nell'ordine di ricerca, cioè dic2 è il primo nella mappa, quindi verrà cercato per primo e così via.
chain1.maps #>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}] |
Allo stesso modo, possiamo controllare chiavi e valori:
lista(catena1.chiavi()) #>> ['a', 'c', 'b'] |
lista(catena1.valori()) #>> [1, 4, 3] |
Come vediamo, vengono mostrate solo le chiavi univoche e anche i valori.
new_child(m=Nessuno)
Il metodo new_child() viene utilizzato per aggiungere nuove mappe nella ChainMap. Questo metodo restituisce una nuova ChainMap con la nuova mappa come prima mappa seguita dal resto delle mappe. Se m viene specificato, diventa la prima mappa, altrimenti viene aggiunto un dizionario vuoto come prima mappa.
chain1.new_child(dic3) chain1.maps |
#Produzione: [{ 'b' : 9 , 'd' : 4 }, { 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }] |
Come vediamo, all'inizio ha aggiunto dic3 e ha restituito un nuovo oggetto ChainMap.
invertito
Ti starai chiedendo come puoi cambiare l'ordine della ChainMap. Ciò può essere ottenuto utilizzando la funzione invertita che restituisce un iteratore per l'iterazione di ChainMap nella direzione inversa. Vediamo questo in azione.
La chiave 'b' è ora in tutte le mappe. La prima mappa nella ChainMap ha la chiave 'b' con valore 9.
catena1[ 'b' ] #>> 9 |
Vediamo cosa succede una volta che ripetiamo nella direzione inversa.
chain1.maps = invertito(chain1.maps) catena1[ 'b' ] #>> 2 |
Tieni presente che la funzione invertita non inverte realmente la mappatura, ma fornisce solo un iteratore invertito.
Leggi: Tutorial Python
Deque
Deque (pronunciato come 'mazzo' ) è un'estensione delle liste, ma a doppia estremità. Deque sta per: Double Ended Queue perché possiamo rimuovere/pop e aggiungere elementi su entrambe le estremità di Deques in modo efficiente, a differenza degli elenchi in cui tutte le operazioni sono sul lato destro.

deque(iterable, maxlen) accetta gli iterabili e restituisce gli oggetti deque. Hanno anche un parametro maxlen che decide il limite superiore del numero di elementi. Se non specificato, deque può crescere indefinitamente. Diamo un'occhiata ai suoi metodi scattanti.
deq = collezioni.deque([ 1 , 2 , 3 , 4 , 5 ], maxlen= 6 ) deq.appendleft( 8 ) |
#Produzione: deque([ 8 , 1 , 2 , 3 , 4 , 5 ]) |
Come vediamo, chiamando il metodo appendleft è stato aggiunto l'elemento all'estremità sinistra. Inoltre, poiché l'abbiamo inizializzato con maxlen come 6 che ha raggiunto ora, l'aggiunta di un altro elemento genererà "StopIterationError".
Quindi, rimuoviamo l'elemento più a sinistra usando popleft :
deq.popleft() #>> 8 |
Possiamo anche rimuovere un elemento specifico per valore usando remove:
deq.rimuovi( 5 ) #>> deque([1, 2, 3, 4]) |
Nota: la chiamata del metodo remove con un elemento che non è nella deque genererà un "ValueError".
Possiamo inserire qualsiasi elemento all'indice specificato usando insert(index, element) .
deq.insert( 2 , 7 ) #>> deque([1, 2, 7, 3, 4]) |
Deque può essere annullato chiamando il metodo reverse .
deq.reverse() #>> deque([4, 3, 7, 2, 1]) |
Deque può anche essere ruotato in senso orario o antiorario utilizzando il metodo di rotazione .
#Senso orariodeq.rotate( 2 )#>> deque([2, 1, 4, 3, 7]) |
#Antiorariodeq.rotate( -2 )#>> deque([4, 3, 7, 2, 1]) |
Tupla denominata
namedtuple() è un grande miglioramento del solito oggetto tupla in Python. Le tuple con nome ci consentono di indicizzare gli elementi in base ai loro nomi anziché solo alle posizioni. Puoi pensare alle tuple denominate come tabelle con il nome della tabella come nome della tupla e i nomi delle colonne come nomi dell'indice. Named Tuple assegna essenzialmente un significato a ciascun elemento per un accesso più semplice e un codice più leggibile.
Facciamo alcuni esempi e capiamo come funziona.
Performance = collections.namedtuple( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ]) |
Nel codice sopra, abbiamo definito un oggetto Named Tuple "Performance" di nome "Employee_Rating" con nomi di campo come "Q1", "Q2", "Q3" e "Q4" che memorizzerà le valutazioni trimestrali dei dipendenti. Facciamo 2 voci di tupla con nome di Employee_Rating.
rahul = Performance( 3 , 4 , 3.5 , 4.5 ) ankit = Performance( 4 , 4.5 , 4 , 4.5 ) |
#Produzione: Valutazione_impiegato(Q1= 4 , Q2= 4,5 , Q3= 4 , Q4= 4,5 ) Valutazione_impiegato(Q1= 3 , Q2= 4 , Q3= 3,5 , Q4= 4,5 ) |
Ora che abbiamo creato 2 voci, possiamo accedervi tramite i nomi degli indici.
ankit.Q1 #>> 4 |
ankit.Q3 > rahul.Q3 #>> Vero |
Per aggiungere nuove voci, o creare nuovi oggetti tupla con nome, possiamo usare il metodo _make() .
Milkha = Performance._make([ 4 , 5 , 5 , 4.5 ]) Milka |
#Produzione: Valutazione_impiegato(Q1= 4 , Q2= 5 , Q3= 5 , Q4= 4,5 ) |
Possiamo modificare gli elementi usando il metodo _replace su qualsiasi tupla denominata.
rahul._replace(Q1= 2 ) |
#Produzione: Valutazione_impiegato(Q1= 2 , Q2= 4 , Q3= 3,5 , Q4= 4,5 ) |
Prima che tu vada
Il modulo Raccolte ha alcune funzioni più utili come OrderedDict, defaultdict, UserList, UserString, UserDict. Assicurati di mettere le mani sulle funzioni che abbiamo discusso in questo tutorial. Questi tipi di contenitori non solo ti semplificano la vita, ma migliorano anche la qualità del codice che scrivi.
Se sei curioso di conoscere Python, la scienza dei dati, dai un'occhiata all'Executive PG Program in Data Science di IIIT-B e upGrad, creato per i professionisti che lavorano e offre oltre 10 casi di studio e progetti, workshop pratici pratici, tutoraggio con esperti del settore , 1 contro 1 con mentori del settore, oltre 400 ore di apprendimento e assistenza al lavoro con le migliori aziende.
Che cos'è un modulo di raccolta e come è utile?
Il modulo di raccolta di Python supporta diversi tipi di contenitori. Un contenitore è un oggetto utilizzato per memorizzare vari elementi e fornire i mezzi per recuperare e scorrere gli oggetti racchiusi. Sono disponibili Tuple, List, Dictionary e altri contenitori integrati. Inoltre, il modulo Raccolte ha tipi di dati contenitore altamente specializzati ed efficienti come namedtuple(), deque, OrderedDict, counter e così via che sono di gran lunga superiori ai contenitori Python standard.
Il modulo di raccolta è un argomento necessario per Python?
Sì, il modulo di raccolta è un argomento necessario durante l'apprendimento di Python. Il conteggio degli oggetti, la costruzione di code e stack, la gestione delle chiavi mancanti nei dizionari e altro sono tutti possibili con il modulo delle raccolte di Python. I tipi di dati e le classi delle raccolte sono creati per essere efficienti e Pythonici. Sono piuttosto preziosi per la tua carriera di programmatore Python, quindi dedicare del tempo a conoscere questo modulo di raccolta vale la pena dedicare tempo e fatica. I contenitori nel modulo Raccolte possono essere molto utili per progetti e modelli a livello aziendale, aggiungendo significativamente all'utilità dei contenitori Python generici attraverso una migliore ottimizzazione e velocità di esecuzione.
Quali sono le tipologie di dati presenti nel Modulo di raccolta?
Nel modulo di raccolta sono presenti diversi tipi di dati, come deque, defaultdict, namedtuple, OrderedDict, Counter, ChainMap, UserDict, UserList, UserString, ecc. Questi tipi di dati possono essere utilizzati per vari motivi, come l'aggiunta e la rimozione di elementi da entrambi fine della sequenza, costruendo valori predefiniti per le chiavi mancanti e aggiungendole automaticamente al dizionario. Questi tipi di dati possono anche aiutare fornendo campi con nome che consentono di accedere agli elementi per nome mantenendo la possibilità di accedere agli elementi per indice, contando elementi univoci in una sequenza o iterabile e trattando più mappature come un unico oggetto dizionario, ecc.