documentación de tutorial de python - 3.4
DESCRIPTION
Python guíaTRANSCRIPT
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 1/13
6.EstructurasdedatosEstecaptulodescribealgunascosasqueyaaprendisteenmsdetalle,yagregaalgunascosasnuevastambin.
6.1.MssobrelistasEltipodedatolistatienealgunosmtodosms.Aquestntodoslosmtodosdelosobjetoslista:
list.append(x)Agregauntemalfinaldelalista.Equivalea a[len(a):]=[x].
list.extend(L)Extiendelalistaagregndoletodoslostemsdelalistadada.Equivalea a[len(a):]=L.
list.insert(i,x)Insertauntemenunaposicindada.Elprimerargumentoeselndicedeltemdelantedelcualseinsertar,porlotanto a.insert(0,x)insertaalprincipiodelalista,y a.insert(len(a),x)equivalea a.append(x).
list.remove(x)Quitaelprimertemdelalistacuyovalorseax.Esunerrorsinoexistetaltem.
list.pop([i])Quitaeltemenlaposicindadadelalista,ylodevuelve.Sinoseespecificaunndice, a.pop()quitaydevuelveelltimotemdelalista.(Loscorchetesqueencierranaienlafirmadelmtododenotanqueelparmetroesopcional,noquedeberasescribircorchetesenesaposicin.VersestanotacinconfrecuenciaenlaReferenciadelaBibliotecadePython.)
list.clear()Quitatodosloselementosdelalista.Equivalentea dela[:].
list.index(x)Devuelveelndiceenlalistadelprimertemcuyovalorseax.Esunerrorsinoexistetaltem.
list.count(x)Devuelveelnmerodevecesquexapareceenlalista.
list.sort()Ordenalostemsdelalistainsitu.
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 2/13
list.reverse()Invierteloselementosdelalistainsitu.
list.copy()Devuelveunacopiasuperficialdelalista.Equivalentea a[:].
Unejemploqueusalamayoradelosmtodosdelista:
>>>a=[66.25,333,333,1,1234.5]>>>print(a.count(333),a.count(66.25),a.count('x'))210>>>a.insert(2,1)>>>a.append(333)>>>a[66.25,333,1,333,1,1234.5,333]>>>a.index(333)1>>>a.remove(333)>>>a[66.25,1,333,1,1234.5,333]>>>a.reverse()>>>a[333,1234.5,1,333,1,66.25]>>>a.sort()>>>a[1,1,66.25,333,333,1234.5]>>>a.pop()1234.5>>>a[1,1,66.25,333,333]
Quizshayasnotadoquemtodoscomo insert, removeo sort,quesolomodificanalalista,notienenimpresounvalorderetornodevuelvenNone.[1]EstoesunprincipiodediseoparatodaslasestructurasdedatosmutablesenPython.
6.1.1.UsandolistascomopilasLosmtodosdelistahacenqueresultemuyfcilusarunalistacomounapila,dondeelltimoelementoaadidoeselprimerelementoretirado(ltimoenentrar,primeroensalir).Paraagregaruntemalacimadelapila,useappend().Pararetiraruntemdelacimadelapila,usepop()sinunndiceexplcito.Porejemplo:
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 3/13
>>>stack=[3,4,5]>>>stack.append(6)>>>stack.append(7)>>>stack[3,4,5,6,7]>>>stack.pop()7>>>stack[3,4,5,6]>>>stack.pop()6>>>stack.pop()5>>>stack[3,4]
6.1.2.UsandolistascomocolasTambinesposibleusarunalistacomounacola,dondeelprimerelementoaadidoeselprimerelementoretirado(primeroenentrar,primeroensalir)sinembargo,laslistasnosoneficientesparaestepropsito.Agregarysacardelfinaldelalistaesrpido,peroinsertarosacardelcomienzodeunalistaeslento(porquetodoslosotroselementostienenqueserdesplazadosporuno).
Paraimplementarunacola,uscollections.dequeelcualfuediseadoparaagregarysacardeambaspuntasdeformarpida.Porejemplo:
>>>fromcollectionsimportdeque>>>queue=deque(["Eric","John","Michael"])>>>queue.append("Terry")#llegaTerry>>>queue.append("Graham")#llegaGraham>>>queue.popleft()#elprimeroenllegarahoraseva'Eric'>>>queue.popleft()#elsegundoenllegarahoraseva'John'>>>queue#elrestodelacolaenrdendellegada['Michael','Terry','Graham']
6.1.3.ComprensindelistasLascomprensionesdelistasofrecenunamaneraconcisadecrearlistas.Sususoscomunessonparahacernuevaslistasdondecadaelementoeselresultadodealgunasoperacionesaplicadasacadamiembrodeotrasecuenciaoiterable,oparacrearunasubsecuenciadeesoselementosparasatisfacerunacondicindeterminada.
Porejemplo,asumamosquequeremoscrearunalistadecuadrados,como:
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 4/13
>>>cuadrados=[]>>>forxinrange(10):...cuadrados.append(x**2)...>>>cuadrados[0,1,4,9,16,25,36,49,64,81]
Podemosobtenerelmismoresultadocon:
cuadrados=[x**2forxinrange(10)]
Estoesequivalentetambina squares=list(map(lambdax:x**2,range(10)))peroesmsconcisoylegible.
Unalistadecomprensinconsistedecorchetesrodeandounaexpresinseguidadeladeclaracinfor(reference.html#for)yluegoceroomsdeclaracionesfor(reference.html#for)oif(reference.html#if).Elresultadoserunanuevalistaquesaledeevaluarlaexpresinenelcontextodelosfor(reference.html#for)oif(reference.html#if)quelesiguen.Porejemplo,estalistadecomprensincombinaloselementosdedoslistassinosoniguales:
>>>[(x,y)forxin[1,2,3]foryin[3,1,4]ifx!=y][(1,3),(1,4),(2,3),(2,1),(2,4),(3,1),(3,4)]
yesequivalentea:
>>>combs=[]>>>forxin[1,2,3]:...foryin[3,1,4]:...ifx!=y:...combs.append((x,y))...>>>combs[(1,3),(1,4),(2,3),(2,1),(2,4),(3,1),(3,4)]
Notcomoelordendelosfor(reference.html#for)yif(reference.html#if)eselmismoenambospedacitosdecdigo.
Silaexpresinesunatupla(comoel (x,y)enelejemploanterior),debeestarentreparntesis.
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 5/13
>>>vec=[4,2,0,2,4]>>>#crearunanuevalistaconlosvaloresduplicados>>>[x*2forxinvec][8,4,0,4,8]>>>#filtrarlalistaparaexcluirnmerosnegativos>>>[xforxinvecifx>=0][0,2,4]>>>#aplicaunafuncinatodosloselementos>>>[abs(x)forxinvec][4,2,0,2,4]>>>#llamaunmtodoacadaelemento>>>frutafresca=['banana','moradeLogan','maracuya']>>>[arma.strip()forarmainfrutafresca]['banana','moradeLogan','maracuya']>>>#creaunalistadetuplasdedoscomo(nmero,cuadrado)>>>[(x,x**2)forxinrange(6)][(0,0),(1,1),(2,4),(3,9),(4,16),(5,25)]>>>#latupladebeestarentreparntesis,sinoesunerror>>>[x,x**2forxinrange(6)]Traceback(mostrecentcalllast):...[x,x**2forxinrange(6)]^SyntaxError:invalidsyntax>>>#aplanarunalistausandocomprensindelistascondos'for'>>>vec=[[1,2,3],[4,5,6],[7,8,9]]>>>[numforeleminvecfornuminelem][1,2,3,4,5,6,7,8,9]
Lascomprensionesdelistaspuedencontenerexpresionescomplejasyfuncionesanidadas:
>>>frommathimportpi>>>[str(round(pi,i))foriinrange(1,6)]['3.1','3.14','3.142','3.1416','3.14159']
6.1.4.ListasporcomprensinanidadasLaexpresininicialdeunacomprensindelistaspuedesercualquierexpresinarbitraria,incluyendootracomprensindelistas.
Considerelsiguienteejemplodeunamatrizde3x4implementadacomounalistadetreslistasdelargo4:
>>>matriz=[...[1,2,3,4],...[5,6,7,8],...[9,10,11,12],...]
Lasiguientecomprensindelistatranspondrlasfilasycolumnas:
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 6/13
>>>[[fila[i]forfilainmatriz]foriinrange(4)][[1,5,9],[2,6,10],[3,7,11],[4,8,12]]
Comovimosenlaseccinanterior,lalistadecomprensinanidadaseevaluaenelcontextodelfor(reference.html#for)quelosigue,porloqueesteejemploequivalea:
>>>transpuesta=[]>>>foriinrange(4):...transpuesta.append([fila[i]forfilainmatriz])...>>>transpuesta[[1,5,9],[2,6,10],[3,7,11],[4,8,12]]
elcual,alavez,eslomismoque:
>>>transpuesta=[]>>>foriinrange(4):...#lassiguientes3lineashacenlacomprensindelistasanidada...fila_transpuesta=[]...forfilainmatriz:...fila_transpuesta.append(fila[i])...transpuesta.append(fila_transpuesta)...>>>transpuesta[[1,5,9],[2,6,10],[3,7,11],[4,8,12]]
Enelmundoreal,deberaspreferirfuncionespredefinidasadeclaracionesconflujocomplejo.Lafuncinzip()haraunbuentrabajoparaestecasodeuso:
>>>list(zip(*matriz))[(1,5,9),(2,6,10),(3,7,11),(4,8,12)]
VerDesempaquetandounalistadeargumentos(controlflow.html#tutunpackingarguments)paradetallesenelasteriscodeestalnea.
6.2.Lainstruccindel(reference.html#del)Hayunamaneradequitaruntemdeunalistadadosundiceenlugardesuvalor:lainstruccindel(reference.html#del).Estaesdiferentedelmtodopop(),elcualdevuelveunvalor.Lainstruccindel(reference.html#del)tambinpuedeusarseparaquitarseccionesdeunalistaovaciarlalistacompleta(loquehacamosantesasignandounalistavacaalaseccin).Porejemplo:
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 7/13
>>>a=[1,1,66.25,333,333,1234.5]>>>dela[0]>>>a[1,66.25,333,333,1234.5]>>>dela[2:4]>>>a[1,66.25,1234.5]>>>dela[:]>>>a[]
del(reference.html#del)puedeusarsetambinparaeliminarvariables:
>>>dela
Hacerreferenciaalnombre adeaquenmsesunerror(almenoshastaqueseleasigneotrovalor).Veremosotrosusosparadel(reference.html#del)msadelante.
6.3.TuplasysecuenciasVimosquelaslistasycadenastienenpropiedadesencomn,comoelindizadoylasoperacionesdeseccionado.Estassondosejemplosdedatosdetiposecuencia(verTiposintegrados(reference.html#typesseq)).ComoPythonesunlenguajeenevolucin,otrosdatosdetiposecuenciapuedenagregarse.Existeotrodatodetiposecuenciaestndar:latupla.
Unatuplaconsistedeunnmerodevaloresseparadosporcomas,porejemplo:
>>>t=12345,54321,'hola!'>>>t[0]12345>>>t(12345,54321,'hola!')>>>#Lastuplaspuedenanidarse:...u=t,(1,2,3,4,5)>>>u((12345,54321,'hola!'),(1,2,3,4,5))>>>#Lastuplassoninmutables:...t[0]=88888Traceback(mostrecentcalllast):File"",line1,inTypeError:'tuple'objectdoesnotsupportitemassignment>>>#peropuedencontenerobjetosmutables:...v=([1,2,3],[3,2,1])>>>v([1,2,3],[3,2,1])
Comopuedesver,enlasalidalastuplassiempreseencierranentreparntesis,paraquelastuplasanidadaspuedaninterpretarsecorrectamentepuedeningresarseconosinparntesis,aunqueamenudolosparntesissonnecesariosdetodasformas(silatuplaespartedeunaexpresinmsgrande).Noesposibleasignaralostemsindividualesdeunatupla,perosinembargossepuedecreartuplasquecontenganobjetosmutables,comolaslistas.
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 8/13
Apesardequelastuplaspuedanparecersealaslistas,frecuentementeseutilizanendistintassituacionesyparadistintospropsitos.Lastuplassoninmutablesynormalmentecontienenunasecuenciaheterogneadeelementosquesonaccedidosaldesempaquetar(vermsadelanteenestaseccin)oindizar(oinclusoaccederporatributoenelcasodelasnamedtuples).Laslistassonmutables,ysuselementossonnormalmentehomogneosyseaccedeniterandoalalista.
Unproblemaparticulareslaconstruccindetuplasquecontengan0o1tem:lasintaxispresentaalgunaspeculiaridadesparaestoscasos.Lastuplasvacasseconstruyenmedianteunpardeparntesisvacounatuplaconuntemseconstruyeponiendounacomaacontinuacindelvalor(noalcanzaconencerrarunnicovalorentreparntesis).Feo,peroefectivo.Porejemplo:
>>>vacia=()>>>singleton='hola',#>>len(vacia)0>>>len(singleton)1>>>singleton('hola',)
Ladeclaracin t=12345,54321,'hola!'esunejemplodeempaquetadodetuplas:losvalores12345, 54321y 'hola!'seempaquetanjuntosenunatupla.
Laoperacininversatambinesposible:
>>>x,y,z=t
Estosellama,apropiadamente,desempaquetadodesecuencias,yfuncionaparacualquiersecuenciaenelladoderechodeligual.Eldesempaquetadodesecuenciasrequierequelacantidaddevariablesalaizquierdadelsignoigualseaeltamaodelasecuencia.Notquelaasignacinmltipleesenrealidadslounacombinacindeempaquetadodetuplasydesempaquetadodesecuencias.
6.4.ConjuntosPythontambinincluyeuntipodedatoparaconjuntos.Unconjuntoesunacoleccinnoordenadaysinelementosrepetidos.Losusosbsicosdestosincluyenverificacindepertenenciayeliminacindeentradasduplicadas.Losconjuntostambinsoportanoperacionesmatemticascomolaunin,interseccin,diferencia,ydiferenciasimtrica.
Lasllavesolafuncinset()puedenusarseparacrearconjuntos.Notqueparacrearunconjuntovacotensqueusar set(),no {}estoltimocreaundiccionariovaco,unaestructuradedatosquediscutiremosenlaseccinsiguiente.
Unapequeademostracin:
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 9/13
>>>canasta={'manzana','naranja','manzana','pera','naranja','banana'}>>>printfruta#muestraqueseremovieronlosduplicados{'pera','manzana','banana','naranja'}>>>'naranja'incanasta#verificacindepertenenciarpidaTrue>>>'yerba'incanastaFalse
>>>#veamoslasoperacionesparalasletrasnicasdedospalabras...>>>a=set('abracadabra')>>>b=set('alacazam')>>>a#letrasnicasena{a','r','b','c','d'}>>>ab#letrasenaperonoenb{'r','b','d'}>>>a|b#letrasenaoenb{'a','c','b','d','m','l','r','z'}>>>a&b#letrasenayenb{'a','c'}>>>a^b#letrasenaobperonoenambos{'b','d','m','l','r','z'}
Deformasimilaralascomprensionesdelistas,esttambinsoportadalacomprensindeconjuntos:
>>>a={xforxin'abracadabra'ifxnotin'abc'}>>>a{'r','d'}
6.5.DiccionariosOtrotipodedatotilincludoenPythoneseldiccionario(verTiposintegrados(reference.html#typesmapping)).Losdiccionariosseencuentranavecesenotroslenguajescomomemoriasasociativasoarreglosasociativos.Adiferenciadelassecuencias,queseindexanmedianteunrangonumrico,losdiccionariosseindexanconclaves,quepuedensercualquiertipoinmutablelascadenasynmerossiemprepuedenserclaves.Lastuplaspuedenusarsecomoclavessisolamentecontienencadenas,nmerosotuplassiunatuplacontienecualquierobjetomutabledirectaoindirectamente,nopuedeusarsecomoclave.Nopodsusarlistascomoclaves,yaquelaslistaspuedenmodificarseusandoasignacinporndice,asignacinporseccin,omtodoscomoappend()yextend().
Lomejorespensarenundiccionariocomounconjuntonoordenadodeparesclave:valor,conelrequerimientodequelasclavesseannicas(dentrodeundiccionarioenparticular).Unpardellavescreanundiccionariovaco: {}.Colocarunalistadeparesclave:valorseparadosporcomasentrelasllavesaadeparesclave:valorinicialesaldiccionarioestatambineslaformaenquelosdiccionariossepresentanenlasalida.
Lasoperacionesprincipalessobreundiccionariosonguardarunvalorconunaclaveyextraeresevalordadalaclave.Tambinesposibleborrarunparclave:valorcon del.Siussunaclavequeyaestenusoparaguardarunvalor,elvalorqueestabaasociadoconesaclavesepierde.Esunerrorextraerunvalorusandounaclavenoexistente.
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 10/13
Hacer list(d.keys())enundiccionariodevuelveunalistadetodaslasclavesusadaseneldiccionario,enunordenarbitrario(silasquersordenadas,usencambio sorted(d.keys()).[2]
Paracontrolarsiunaclaveesteneldiccionario,uselin(reference.html#in).
Unpequeoejemplodeusodeundiccionario:
>>>tel={'jack':4098,'sape':4139}>>>tel['guido']=4127>>>tel{'sape':4139,'jack':4098,'guido':4127}>>>tel['jack']4098>>>deltel['sape']>>>tel['irv']=4127>>>tel{'jack':4098,'irv':4127,'guido':4127}>>>list(tel.keys())['irv','guido','jack']>>>sorted(tel.keys())['guido','irv','jack']>>>'guido'intelTrue>>>'jack'notintelFalse
Elconstructordict()creaundiccionariodirectamentedesdesecuenciasdeparesclavevalor:
>>>dict([('sape',4139),('guido',4127),('jack',4098)]){'sape':4139,'jack':4098,'guido':4127}
Adems,lascomprensionesdediccionariossepuedenusarparacreardiccionariosdesdeexpresionesarbitrariasdeclaveyvalor:
>>>{x:x**2forxin(2,4,6)}{2:4,4:16,6:36}
Cuandolasclavessoncadenassimples,avecesresultamsfcilespecificarlosparesusandoargumentosporpalabraclave:
>>>dict(sape=4139,guido=4127,jack=4098){'sape':4139,'jack':4098,'guido':4127}
6.6.TcnicasdeiteracinCuandoiteramossobrediccionarios,sepuedenobteneralmismotiempolaclaveysuvalorcorrespondienteusandoelmtodoitems().
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 11/13
>>>caballeros={'gallahad':'elpuro','robin':'elvaliente'}>>>fork,vincaballeros.items():...print(k,v)...gallahadelpurorobinelvaliente
Cuandoseiterasobreunasecuencia,sepuedeobtenerelndicedeposicinjuntoasuvalorcorrespondienteusandolafuncinenumerate().
>>>fori,vinenumerate(['ta','te','ti']):...print(i,v)...0ta1te2ti
Paraiterarsobredosomssecuenciasalmismotiempo,losvalorespuedenemparejarseconlafuncinzip().
>>>preguntas=['nombre','objetivo','colorfavorito']>>>respuestas=['lancelot','elsantogrial','azul']>>>forp,rinzip(preguntas,respuestas):...print('Cualestu{0}?{1}.'.format(p,r))...Cualestunombre?lancelot.Cualestuobjetivo?elsantogrial.Cualestucolorfavorito?azul.
Paraiterarsobreunasecuenciaenordeninverso,seespecificaprimerolasecuenciaalderechoyluegosellamaalafuncinreversed().
>>>foriinreversed(range(1,10,2)):...print(i)...97531
Paraiterarsobreunasecuenciaordenada,seutilizalafuncinsorted()lacualdevuelveunanuevalistaordenadadejandoalaoriginalintacta.
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 12/13
>>>canasta=['manzana','naranja','manzana','pera','naranja','banana']>>>forfinsorted(set(canasta)):...print(f)...bananamanzananaranjapera
Paracambiarunasecuenciasobrelaqueestsiterandomientrasestsadentrodelciclo(porejemploparaduplicaralgunostems),serecomiendaqueprimerahagasunacopia.Ciclarsobreunasecuencianohaceimplcitamenteunacopia.Lanotacinderebanadasesespecialmenteconvenienteparaesto:
>>>palabras=['gato','ventana','defenestrar']>>>forpinpalabras[:]:#ciclarsobreunacopiadelalistaentera...iflen(p)>6:...palabras.insert(0,p)...>>>palabras['defenestrar','gato','ventana','defenestrar']
6.7.MsacercadecondicionesLascondicionesusadasenlasinstrucciones whilee ifpuedencontenercualquieroperador,noslocomparaciones.
Losoperadoresdecomparacin iny notinverificansiunvalorest(onoest)enunasecuencia.Losoperadores ise isnotcomparansidosobjetossonrealmenteelmismoobjetoestoessignificativosloparaobjetosmutablescomolaslistas.Todoslosoperadoresdecomparacintienenlamismaprioridad,lacualesmenorqueladetodoslosoperadoresnumricos.
Lascomparacionespuedenencadenarse.Porejemplo, a
-
19/5/2015 6. Estructuras de datos documentacin de Tutorial de Python - 3.4.2
http://docs.python.org.ar/tutorial/3/datastructures.html 13/13
BacktotopCopyright2014,PythonSoftwareFoundation.CreatedusingSphinx(http://sphinx.pocoo.org/)1.2.2.
>>>cadena1,cadena2,cadena3='','Trondheim','PasoHammer'>>>non_nulo=cadena1orcadena2orcadena3>>>non_nulo'Trondheim'
NotqueenPython,adiferenciadeC,laasignacinnopuedeocurrirdentrodeexpresiones.LosprogramadoresdeCpuedenrenegarporesto,peroesalgoqueevitauntipodeproblemacomnencontradoenprogramasenC:escribir =enunaexpresincuandoloquesequiereescribires ==.
6.8.ComparandosecuenciasyotrostiposLassecuenciaspuedencompararseconotrosobjetosdelmismotipodesecuencia.Lacomparacinusaordenlexicogrfico:primerosecomparanlosdosprimerostems,sisondiferentesestoyadeterminaelresultadodelacomparacinsisoniguales,secomparanlossiguientesdostems,yassucesivamentehastallegaralfinaldealgunadelassecuencias.Sidostemsacompararsonambossecuenciasdelmismotipo,lacomparacinlexicogrficaesrecursiva.Sitodoslostemsdedossecuenciasresultaniguales,seconsideraquelassecuenciassoniguales.
Siunasecuenciaesunasubsecuenciainicialdelaotra,lasecuenciamscortaeslamenor.ElordenlexicogrficoparacadenasdecaracteresutilizaelordendecdigosUnicodeparacaracteresindividuales.Algunosejemplosdecomparacionesentresecuenciasdelmismotipo:
(1,2,3)