Modulul Python Collections: Counter, ChainMap, Deque & Tuple

Publicat: 2020-12-01

Modulul Python Collections oferă un set de tipuri de date container care extind caracteristicile containerelor stoc, cum ar fi Liste, Tuple, Seturi și Dicționare. Cu aceste containere speciale, nu aveți doar caracteristicile containerelor de stoc, ci și câteva metode suplimentare care sunt foarte utile pentru anumite sarcini.

Până la sfârșitul acestui tutorial, veți avea cunoștințele despre următoarele:

  • Ce este modulul de colecții?
  • Diverse funcții precum:
  1. Tejghea
  2. ChainMap
  3. Deque
  4. Numit Tuple
  • Exemple de lucru

Modulul Colecții vine preinstalat în Python, așa că nu trebuie să-l instalăm pip. Putem doar să-l importăm și ești gata de plecare! Să intrăm în detaliu la cele mai utilizate funcții.

Învățați învățați știința datelor de la cele mai bune universități din lume. Câștigă programe Executive PG, programe avansate de certificat sau programe de master pentru a-ți accelera cariera.

Trebuie citit: Aplicații Python fascinante în lumea reală

Cuprins

Tejghea

Contorul este cu ușurință cea mai folosită și cea mai utilă funcție din modulul Colecții. Counter este o subclasă a clasei de dicționar în Python. Numărează numărul de apariții ale fiecărui element dintr-un iterabil (cum ar fi șiruri, tupluri, liste etc.) și îl stochează într-un dicționar. Cheile de dicționar sunt elementele unice din iterabil, iar valorile sunt numărul acelor elemente.

Să încercăm cu câteva exemple.

Importa colecții
Marvel = „Bad Wolverine l-a agresat pe bietul Iron Man”
Marvel_count = colecții.Counter(Marvel.split())

#Ieșire:
Contor({ „Rău” : 3 ,
„Fier de călcat” : 2 ,
„Bărbat” : 2 ,
„Sărac” : 2 ,
„Wolverine” : 2 ,
„bullyed” : 1 })

După cum vedem, a numărat aparițiile fiecărui element și le-a pus într-un dicționar. Acesta poate fi folosit în orice tip de iterabil. Acum să vedem ce metode are.

Marvel_count[ „Rău” ]
#>> 3

Marvel_count.values()
#>> dict_values([3, 2, 1, 2, 2, 2])

Marvel_count.keys()
#>> dict_keys([„Rău”, „Wolverine”, „bullyed”, „Iron”, „Bărbat”, „Sărac”])

Metoda most_common(n) returnează o listă cu cele mai comune n elemente aranjate într-o ordine descrescătoare a numărului.

Marvel_count.most_common( 2 )
#>> [(„Rău”, 3), („Wolverine”, 2)]

ChainMap

ChainMap este folosit pentru a face o singură vizualizare a mai multor dicționare, astfel încât acestea să poată fi accesate și actualizate dintr-o singură vizualizare, adică obiectul ChainMap în sine. Rețineți că aceste ChainMaps constau doar din referințe la dicționarele reale, iar actualizarea se face și în dicționarele reale.

ChainMap este o extensie a clasei dicționar, astfel încât toate metodele dicționarului sunt acceptate, plus câteva metode suplimentare pe care le vom analiza.

dic1 = { 'a' : 1 , 'b' : 2 }
dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 }
lanț1 = colecții.ChainMap(dic2, dic1)
lanț1

În codul de mai sus, definim două dicționare dic1 și dic2 și le punem într-un obiect ChainMap.

#Ieșire:
ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 })

După cum vedem, dic2 este „înlănțuit” cu dic1 chiar în această ordine. În esență, vă puteți imagina dic2 conectat la dic1 ca dic2–>dic1. Deci, atunci când căutăm cheia „b”, va căuta mai întâi în prima mapare care este dic2 și dacă cheia nu este găsită, va merge la mapările următoare.

Prin urmare, ordinea ChainMap este importantă pentru a determina care mapare este căutată prima. Să vedem asta în acțiune.

lanț1[ 'b' ]
#>> 3

După cum vedem că mai sus ChainMap are cheia „b” în ambele dicționare. Deci, când căutăm cheia „b”, aceasta caută în prima mapare care este dic2 și returnează valoarea.

atributul hărților

Atributul de hărți ChainMap returnează o listă de mapări în ordinea căutării, adică dic2 este primul pe hartă, deci va fi căutat primul și așa mai departe.

lanţ1.hărţi
#>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}]

În mod similar, putem verifica cheile și valorile:

listă(lanț1.chei())
#>> ['a', 'c', 'b']

listă(lanț1.valori())
#>> [1, 4, 3]

După cum vedem, sunt afișate doar cheile unice și, de asemenea, valorile.

copil_nou(m=Niciunul)

Metoda new_child() este folosită pentru a adăuga hărți noi în ChainMap. Această metodă returnează un nou ChainMap cu noua hartă ca primă hartă urmată de restul hărților. Dacă este specificat m, devine prima hartă, altfel un dicționar gol este adăugat ca primă hartă.

chain1.new_child(dic3)
lanţ1.hărţi

#Ieșire:
[{ 'b' : 9 , 'd' : 4 }, { 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }]

După cum vedem, a adăugat dic3 la început și a returnat un nou obiect ChainMap.

inversat

S-ar putea să vă întrebați cum puteți schimba ordinea ChainMap. Acest lucru poate fi realizat folosind funcția inversată, care returnează un iterator pentru iterarea prin ChainMap în direcția inversă. Să vedem asta în acțiune.

Cheia „b” este acum în toate hărțile. Prima hartă din ChainMap are cheia „b” cu valoarea 9.

lanț1[ 'b' ]
#>> 9

Să vedem ce se întâmplă odată ce repetăm ​​în direcția inversă.

chain1.maps = inversat(chain1.maps)
lanț1[ 'b' ]
#>> 2

Rețineți că funcția inversată nu inversează cu adevărat maparea, ci oferă doar un iterator inversat.

Citiți: Tutorial Python

Deque

Deque (pronunțat ca „deck” ) este o extensie a listelor, dar una dublu. Deque înseamnă: Double Ended Queue deoarece putem elimina/pop și adăuga elemente la fiecare capăt al Deques în mod eficient, spre deosebire de listele în care toate operațiunile sunt pe partea dreaptă.

deque(iterable, maxlen) preia iterabile și returnează obiecte deque. Au, de asemenea, un parametru maxlen care decide limita superioară a numărului de elemente. Dacă nu este specificat, deque poate crește la infinit. Să aruncăm o privire la metodele sale rapide.

deq = collections.deque([ 1 , 2 , 3 , 4 , 5 ], maxlen= 6 )
deq.appendleft( 8 )

#Ieșire:
deque([ 8 , 1 , 2 , 3 , 4 , 5 ])

După cum vedem, apelarea metodei appendleft a adăugat elementul la capătul din stânga. Mai mult, așa cum l-am inițializat cu maxlen ca 6 la care a ajuns acum, adăugarea unui alt element va genera „StopIterationError”.

Deci, să eliminăm elementul cel mai din stânga folosind popleft :

deq.popleft()
#>> 8

De asemenea, putem elimina un anumit element după valoare folosind remove:

deq.remove( 5 )
#>> deque([1, 2, 3, 4])

Notă: apelarea metodei de eliminare cu un element care nu este în deque va arăta o „ValueError”.

Putem insera orice element la indexul specificat folosind insert(index, element) .

deq.insert( 2 , 7 )
#>> deque([1, 2, 7, 3, 4])

Deque poate fi inversat apelând metoda inversă .

deq.reverse()
#>> deque([4, 3, 7, 2, 1])


Deque poate fi, de asemenea, rotit în sensul acelor de ceasornic sau în sens invers acelor de ceasornic folosind metoda de rotire .

#În sensul acelor de ceasornicdeq.rotate( 2 )#>> deque([2, 1, 4, 3, 7])

#Anti sensul acelor de ceasornicdeq.rotate( -2 )#>> deque([4, 3, 7, 2, 1])

Numit Tuple

namedtuple() este o mare creștere a obiectului tuplu obișnuit în Python. Tuplurile numite ne permit să indexăm elementele după nume, mai degrabă decât doar după poziții. Vă puteți gândi la tupluri numite ca tabele cu numele tabelului ca nume tuplu și numele coloanelor ca nume de index. Named Tuple atribuie în esență sens fiecărui element pentru un acces mai ușor și un cod mai ușor de citit.

Să luăm câteva exemple și să înțelegem cum funcționează.

Performanță = collections.namedtuple( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ])

În codul de mai sus, am definit un obiect tuplu numit „Performanță” cu numele „Employee_Rating” cu nume de câmpuri ca „Q1”, „Q2”, „Q3” și „Q4” care va stoca evaluările trimestriale ale angajaților. Să facem 2 intrări de tuplu numit de Employee_Rating.

rahul = Performanță( 3 , 4 , 3.5 , 4.5 )
ankit = Performance( 4 , 4.5 , 4 , 4.5 )

#Ieșire:
Evaluarea_angajaților(Q1= 4 , Q2= 4,5 , Q3= 4 , Q4= 4,5 )
Evaluarea_angajaților(Q1= 3 , Q2= 4 , Q3= 3,5 , Q4= 4,5 )


Acum că am creat 2 intrări, le putem accesa prin nume de index.

ankit.Q1
#>> 4

ankit.Q3 > rahul.Q3
#>> Adevărat


Pentru a adăuga intrări noi sau pentru a crea noi obiecte tuple numite, putem folosi metoda _make() .

Milkha = Performance._make([ 4 , 5 , 5 , 4.5 ])
Milkha

#Ieșire:
Evaluarea_angajaților(Q1= 4 , Q2= 5 , Q3= 5 , Q4= 4,5 )

Putem edita elementele folosind metoda _replace pe orice tuplu numit.

rahul._replace(Q1= 2 )

#Ieșire:
Evaluarea_angajaților(Q1= 2 , Q2= 4 , Q3= 3,5 , Q4= 4,5 )

Inainte sa pleci

Modulul Colecții are câteva funcții utile, cum ar fi OrderedDict, defaultdict, UserList, UserString, UserDict. Asigurați-vă că puneți mâna pe funcțiile pe care le-am discutat în acest tutorial. Aceste tipuri de containere nu numai că vă fac viața mai ușoară, dar îmbunătățesc și calitatea codului pe care îl scrieți.

Dacă sunteți curios să aflați despre python, știința datelor, consultați programul Executive PG în știința datelor de la IIIT-B și upGrad, care este creat pentru profesioniști care lucrează și oferă peste 10 studii de caz și proiecte, ateliere practice practice, mentorat cu experți din industrie , 1-la-1 cu mentori din industrie, peste 400 de ore de învățare și asistență profesională cu firme de top.

Ce este un modul de colectare și cum este util?

Modulul de colectare al lui Python acceptă mai multe tipuri de containere. Un Container este un obiect folosit pentru a stoca diverse articole și pentru a oferi mijloacele de a prelua și de a repeta peste obiectele incluse. Sunt disponibile containere Tuple, Listă, Dicționar și mai multe încorporate. De asemenea, modulul Colecții are tipuri de date container foarte specializate și eficiente, cum ar fi namedtuple(), deque, OrderedDict, counter și așa mai departe, care sunt cu mult superioare containerelor standard Python.

Modulul de colectare este un subiect necesar pentru Python?

Da, modulul de colectare este un subiect necesar în timp ce învățați Python. Numărarea obiectelor, construirea de cozi și stive, gestionarea cheilor lipsă din dicționare și multe altele sunt posibile cu modulul de colecții al lui Python. Tipurile și clasele de date ale colecțiilor sunt create pentru a fi eficiente și Pythonic. Ele sunt destul de valoroase pentru cariera dvs. de programare Python, așa că să vă dedicați timp pentru a afla despre acest modul de colecție merită din plin timpul și efortul dvs. Containerele din modulul Colecții pot fi destul de benefice pentru proiecte și modele la nivel de afaceri, adăugând în mod semnificativ utilitatea containerelor Python generice prin optimizare și viteză de execuție îmbunătățite.

Care sunt tipurile de date prezente în modulul de colectare?

În modulul de colectare sunt prezente mai multe tipuri de date, cum ar fi deque, defaultdict, namedtuple, OrderedDict, Counter, ChainMap, UserDict, UserList, UserString etc. Aceste tipuri de date pot fi utilizate din diferite motive, cum ar fi adăugarea și eliminarea articolelor din oricare sfârșitul secvenței, construind valori implicite pentru cheile lipsă și adăugându-le automat în dicționar. Aceste tipuri de date pot ajuta, de asemenea, prin furnizarea de câmpuri denumite care permit accesarea articolelor după nume, păstrând în același timp capacitatea de a accesa articolele prin index, numărând elemente unice într-o secvență sau iterabile și tratând mai multe mapări ca un singur obiect dicționar etc.