Trobar elements repetits

Escrit per Aaloy a 15 de June , 2008 a les 12:37 p.m.

Tenim el següent problema: "tenim dos diccionaris amb dades i volem trobar els elements d'una diccionari que estan també dins l'altra"

Suposem, per exemple que tenim:

x = {'a':1,'b':2,'r':3}
y = {'a':1,'r':3, 'c':14}

La opció més directe pareix ser la de recorre els elements de la primera llista i veure si hi són a la segona, una cosa com

for valor in x.keys():
    if y[valor]:
        print valor, y[valor]
a 1
r 3

o bé una altra opció més curta:

for repe in set(x).intersection(set(y)):
     print repe, x[repe]

o si m'apurau

[ (repe,x[repe]) for repe in set(x).intersection(set(y))]
[('a', 1), ('r', 3)]

Ara quan algú us demani que és això de que Python ve amb les piles incloses ja teniu un exemple més per a mostrar.

4 comentaris, 0 trackbacks (URL) , Tags: Python


Comentaris


1 Comentari de guillem a les 03:06 del Sunday 15 Jun de 2008

El que m'emprenya és que hi ha gent que vé de Java ó .NET i fa la primera versió (de fet el doble de llarga, jo no podria però ells saben com). I després van i diuen que Python és molt més lent perquè no és compilat (no perquè ho hagin provat), molt més complicat (és a dir, diferent del que ja saben) i que no aporta res més perquè tanmateix amb el que ja saben "se pot fer el mateix". Grrrr... caps quadrats...



2 Comentari de aaloy a les 03:06 del Sunday 15 Jun de 2008

Bé, com se sol dir, pots escriure FORTRAN en qualsevol llenguatge :) I això t'ho diu algú que hi ha programat molt en FORTRAN :)



3 Comentari de aaloy a les 03:06 del Sunday 15 Jun de 2008

Per cert, vaig llegir a un blog un tipus que havia fet una cosa semblant al que escric però comparant temps. El fer servir els conjunts i la intersecció era si no record malament el mètode més ràpid per a fer aquesta cerca.

Venia també a dir que moltes vegades la primera optimització que es pot fer no és passar d'un llenguatge interpretat a un compilat, sinó verificar que el nostre algorisme és prou bo.

A la llista de Django hi havia algú amb un problema semblant al que planteig i algú li havia donat la primera solució. Preparant la resposta ha sorgit l'article (després he vist que ho volia fer amb plantilles, però això ja és una altra cosa...)



4 Comentari de servo a les 04:06 del Sunday 15 Jun de 2008

Per a petits diccionaris ja va be, però hauriem de tenir en compte el cost computacional d'emprar intersection si volem coses que tractin moltes dades (no sé on puc pegar un vistasso al codi, però per les proves que he fet fa més via el simple for valor in x.keys() amb la seva comparació, doncs és un O(n) de tota la vida amb un coeficient irrisori).

D'això sorgeix una pregunta .. quina estructura de dades empra python per representar els diccionaris?



Avís: Els comentaris es tanquen automàticament als 30 dies