Discussione:
[Python] Confronto due stringhe "dettagliato"
unknown
2008-01-10 11:22:04 UTC
Permalink
Ciao a tutti,

volevo sapere se esiste qualche comando python per confrontare due stringhe
e che torni ad esempio quanti caratteri uguali ci sono nella medesima
posizione nelle due stringhe.

Ad esempio se str1='ciao' e str2='cibo' un comando che torni 3

So che sarebbe fattibile confrontando ogni singolo carattere ma mi chiedevo
se tra le utility di python già non ci fosse qualcosa che gestisce questo.

Grazie
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20080110/5d3ca974/attachment.htm
unknown
2008-01-11 07:11:15 UTC
Permalink
Post by unknown
Ciao a tutti,
volevo sapere se esiste qualche comando python per confrontare due
stringhe e che torni ad esempio quanti caratteri uguali ci sono nella
medesima posizione nelle due stringhe.
Ad esempio se str1='ciao' e str2='cibo' un comando che torni 3
So che sarebbe fattibile confrontando ogni singolo carattere ma mi
chiedevo se tra le utility di python già non ci fosse qualcosa che
gestisce questo.
str1 = 'ciao'
str2 = 'cibo'
set1 = set(str1)
set2 = set(str2)
set1 & set2
set(['i', 'c', 'o'])
Post by unknown
len(set1 & set2)
3
Post by unknown
len(set('ciao') & set('cibo'))
3

Ciao!

Simone
Chiacchiera con i tuoi amici in tempo reale!
http://it.yahoo.com/mail_it/foot/*http://it.messenger.yahoo.com
unknown
2008-01-11 08:31:40 UTC
Permalink
Post by unknown
Ciao a tutti,
volevo sapere se esiste qualche comando python per confrontare due
stringhe e che torni ad esempio quanti caratteri uguali ci sono nella
medesima posizione nelle due stringhe.
Ad esempio se str1='ciao' e str2='cibo' un comando che torni 3
So che sarebbe fattibile confrontando ogni singolo carattere ma mi
chiedevo se tra le utility di python già non ci fosse qualcosa che
gestisce questo.
C'è la difflib, che serve a comparare due sequenze generiche di oggetti:

In [1]: import difflib

In [2]: difflib.SequenceMatcher(None, "ciao", "cibo").get_opcodes()
Out[2]: [('equal', 0, 2, 0, 2), ('replace', 2, 3, 2, 3), ('equal', 3, 4, 3, 4)]

"SequenceMatcher(f, a, b).get_opcodes()" restituisce una lista di quintuplette
(tag, i1, i2, j1, j2): ognuna dice in che relazione sono i caratteri a[i1:j1]
con i caratteri b[i2:j2]. Tag può essere 'replace', 'delete', 'insert',
'equal'. f serve ad avere il controllo su quale elementi ignorare.

Leggi http://docs.python.org/lib/module-difflib.html per i dettagli.

Ciao!
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
unknown
2008-01-11 09:03:57 UTC
Permalink
Grazie devo approfondire questa SequenceMatcher, non la conoscevo.
Ringrazio anche Daniele il metodo che consigli lo conosco ma restituisce
quanti caratteri uguali ci sono ma non tiene in considerazione la posizione.
Post by unknown
Post by unknown
Ciao a tutti,
volevo sapere se esiste qualche comando python per confrontare due
stringhe e che torni ad esempio quanti caratteri uguali ci sono nella
medesima posizione nelle due stringhe.
Ad esempio se str1='ciao' e str2='cibo' un comando che torni 3
So che sarebbe fattibile confrontando ogni singolo carattere ma mi
chiedevo se tra le utility di python già non ci fosse qualcosa che
gestisce questo.
In [1]: import difflib
In [2]: difflib.SequenceMatcher(None, "ciao", "cibo").get_opcodes()
Out[2]: [('equal', 0, 2, 0, 2), ('replace', 2, 3, 2, 3), ('equal', 3, 4, 3, 4)]
"SequenceMatcher(f, a, b).get_opcodes()" restituisce una lista di quintuplette
(tag, i1, i2, j1, j2): ognuna dice in che relazione sono i caratteri a[i1:j1]
con i caratteri b[i2:j2]. Tag può essere 'replace', 'delete', 'insert',
'equal'. f serve ad avere il controllo su quale elementi ignorare.
Leggi http://docs.python.org/lib/module-difflib.html per i dettagli.
Ciao!
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
_______________________________________________
Python mailing list
Python a lists.python.it
http://lists.python.it/mailman/listinfo/python
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20080111/6f284d20/attachment-0001.htm
unknown
2008-01-11 14:30:31 UTC
Permalink
Post by unknown
Grazie devo approfondire questa SequenceMatcher, non la conoscevo.
Se vuoi evitare una libreria a costo di introdurre dello schifo, è pur
sempre una riga :-)
Post by unknown
(lambda x, y : len([x[i] for i in range(min(len(x),len(y))) if x[i]
== y[i]])) (list('ciao'), list('cibo'))
3

Pietro
unknown
2008-01-11 15:54:52 UTC
Permalink
Post by unknown
Post by unknown
Grazie devo approfondire questa SequenceMatcher, non la conoscevo.
Se vuoi evitare una libreria a costo di introdurre dello schifo, è pur
sempre una riga :-)
Post by unknown
(lambda x, y : len([x[i] for i in range(min(len(x),len(y))) if x[i]
== y[i]])) (list('ciao'), list('cibo'))
3
prova con "essere" e "sere" (chiariamo, dipende tutto da quello che l'OP
deve farci con l'informazione cercata)

btw questa versione è più compatta (anche se non meno schifosa :D)

In [38]: f = lambda s1,s2: sum(1 for c1,c2 in zip(s1, s2) if c1 == c2)

In [39]: f('ciao', 'cibo')
Out[39]: 3
--
Under construction
unknown
2008-01-11 18:19:37 UTC
Permalink
Post by unknown
Post by unknown
Post by unknown
Grazie devo approfondire questa SequenceMatcher, non la conoscevo.
Se vuoi evitare una libreria a costo di introdurre dello schifo, è pur
sempre una riga :-)
Post by unknown
(lambda x, y : len([x[i] for i in range(min(len(x),len(y))) if x[i]
== y[i]])) (list('ciao'), list('cibo'))
3
prova con "essere" e "sere" (chiariamo, dipende tutto da quello che l'OP
deve farci con l'informazione cercata)
btw questa versione è più compatta (anche se non meno schifosa :D)
In [38]: f = lambda s1,s2: sum(1 for c1,c2 in zip(s1, s2) if c1 == c2)
Per stare al gioco: puoi anche sommare tra loro i bool:

In [1]: def f(s1, s2):
...: return sum(c1 == c2 for c1, c2 in zip(s1, s2))
...:

In [2]: f('ciao', 'cibo')
Out[2]: 3
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
unknown
2008-01-11 18:31:28 UTC
Permalink
Post by unknown
prova con "essere" e "sere" (chiariamo, dipende tutto da quello che l'OP
deve farci con l'informazione cercata)
1, mi sembra giusto, no?
Post by unknown
btw questa versione è più compatta (anche se non meno schifosa :D)
In [38]: f = lambda s1,s2: sum(1 for c1,c2 in zip(s1, s2) if c1 == c2)
Dai, mica brutta, penso che sia anche il massimo dell'efficienza che si
può raggiungere (senza un modulo che lo faccia in C, ovviamente...)

Pietro
unknown
2008-01-20 14:47:01 UTC
Permalink
Post by unknown
In [38]: f = lambda s1,s2: sum(1 for c1,c2 in zip(s1, s2) if c1 == c2)
Stilisticamente i pythonisti sono un po' contrari alle lambda con nome.

Se ci pensi il punto di lambda è creare una funzione *senza* darle un
nome.
Se poi prendi l'oggetto funzione e gli dai un nome, quale dovrebbe
essere il presunto vantaggio di non usare la classica def?
unknown
2008-01-20 18:02:51 UTC
Permalink
Post by unknown
Post by unknown
In [38]: f = lambda s1,s2: sum(1 for c1,c2 in zip(s1, s2) if c1 == c2)
Stilisticamente i pythonisti sono un po' contrari alle lambda con nome.
guarda che avevo detto chiaramente che era una porcata!
Post by unknown
Se ci pensi il punto di lambda è creare una funzione *senza* darle un
nome.
ovvio, ma...
Post by unknown
Se poi prendi l'oggetto funzione e gli dai un nome, quale dovrebbe
essere il presunto vantaggio di non usare la classica def?
...mi ha consentito d'avere un one liner più corto :D

come puoi vedere, l'equivalente ottenuta con "def" è più lunga di ben 4
caratteri! (oltre l'a-capo aggiuntivo che vuole ipython)

In [1]: f = lambda s1,s2: sum(1 for c1,c2 in zip(s1, s2) if c1 == c2)

In [2]: def f(s1, s2): return sum(1 for c1, c2 in zip(s1, s2) if c1 == c2)
...:
--
Under construction
unknown
2008-01-20 14:49:57 UTC
Permalink
Post by unknown
volevo sapere se esiste qualche comando python per confrontare due
stringhe e che torni ad esempio quanti caratteri uguali ci sono
nella medesima posizione nelle due stringhe.
Posso chiederti cosa vuoi farci? Ci sono diversi algoritmi noti per
misurare quanto 'simili' sono due stringhe. Algoritmi anche in qualche
modo più raffinati di quello che chiedi. Nel tuo algoritmo per esempio
non è chiaro cosa si debba fare quando due stringhe sono di lunghezza
diversa. Che è esattamente quello che accadrebbe se uno si scorda un
carattere (banale errore ortografico). Un algoritmo di quelli che dico
sarebbe in gradi di vedere che la parola 'sbagliata' è *molto* vicina
alla parola corretta.

Che so... guarda la distanza di Levenshtein.
unknown
2008-01-20 18:03:13 UTC
Permalink
Un algoritmo di quelli che dico
Post by unknown
sarebbe in gradi di vedere che la parola 'sbagliata' è *molto* vicina
alla parola corretta.
Che so... guarda la distanza di Levenshtein.
sbaglio o qualcosa del genere lo usa anche google?
unknown
2008-01-20 20:44:24 UTC
Permalink
Post by unknown
Un algoritmo di quelli che dico
Post by unknown
sarebbe in gradi di vedere che la parola 'sbagliata' è *molto* vicina
alla parola corretta.
Che so... guarda la distanza di Levenshtein.
sbaglio o qualcosa del genere lo usa anche google?
Per il "forse cercavi", penso di sì (ovviamente combinata con qualche
dato sulla diffusione delle parole cercate e di quelle "vicine").

Per quell'orrenda funzione che quando cerchi una parola te ne trova
anche singolare/plurale, femminile/maschile ecc. invece no, penso che
invece si basi su dizionari (o al limite su qualche semplice regoletta
che funziona quasi sempre).

Pietro
unknown
2008-01-21 13:50:41 UTC
Permalink
Post by unknown
Posso chiederti cosa vuoi farci?
Nulla di particolare, date due stringhe mi serve ricavare il numero di
caratteri uguali (non solo come valore ma anche come posizione)

Cmq con i classici metodi ho già fatto da tempo era solo per capire se
esisteva qualcosa di già pronto.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20080121/28354277/attachment.htm
Continua a leggere su narkive:
Loading...