2011-12-17 16 views
9

Ho due stringhe di uguale lunghezza, come posso trovare tutte le posizioni in cui le stringhe sono diverse?Trova la posizione della differenza tra due stringhe

Ad esempio, "HELPMEPLZ" e "HELPNEPLX" sono differenti nelle posizioni 4 e 8.

+0

sembra come fare i compiti a casa. mostra cosa hai provato e dove hai problemi, quindi prova a porre domande specifiche – tback

+0

Non è compito, ho bisogno di un funzione molto più grande. Quindi è un po 'difficile scrivere tutto qui .. –

+0

Ma le funzioni suddividono le stringhe: (' HEL ',' PME ',' PLZ ') e (' HEL ',' PNE ',' PLX ') –

risposta

2

Se si memorizzano le due stringhe in a e b, è possibile scorrere tutti gli elementi e controllare disuguaglianza.

python interprete interattivo:

>>> for i in range(len(a)): 
... if a[i] != b[i]: print i, a[i], b[i] 
... 
4 M N 
8 Z X 

Un altro modo per farlo è con list comprehension. È tutto in una riga e l'output è una lista.

>>> [i for i in range(len(a)) if a[i] != b[i]] 
[4, 8] 

Ciò rende davvero facile racchiudere una funzione, il che rende facile chiamarlo su una varietà di input.

>>> def dif(a, b): 
...  return [i for i in range(len(a)) if a[i] != b[i]] 
... 
>>> dif('HELPMEPLZ', 'HELPNEPLX') 
[4, 8] 
>>> dif('stackoverflow', 'stacklavaflow') 
[5, 6, 7, 8] 
+0

Non utilizzare lambda quando non è necessario: 'dif dif (a, b): restituisce [i per i in range (len (a)) if a [i]! = B [i]]' –

+0

@StevenRumbalski, perché no? Fa esattamente la stessa cosa ... per quanto ne so. È solo meno pitonico? O più lento? – FakeRainBrigand

+0

I Lambdas sono per le funzioni * anonime * ed eccellenti per la creazione di un solo liner. Qui, si assegna un nome al lambda, il che suggerisce che sarebbe meglio come funzione regolare. Inoltre, lambda oscura il tuo traceback quando hai un bug .. –

1

modo più semplice è quello di dividere i dati nel due array char e quindi scorrere confrontando le lettere e restituire l'indice quando i due caratteri no uguali tra loro.

Questo metodo funzionerà correttamente purché entrambe le stringhe abbiano la stessa lunghezza.

1

Accoppia le stringhe carattere per carattere e itera su questa raccolta insieme a un indice di conteggio. Verifica se i caratteri di ciascuna coppia differiscono; se lo fanno, produci l'indice di dove.

Usare Python funzioni interne si può fare questo ordinatamente in una sola riga:

>>> x = 'HELPMEPLZ' 
>>> y = 'HELPNEPLX' 
>>> {i for i, (left, right) in enumerate(zip(x,y)) if left != right} 
{8, 4} 
+0

Sebbene il PO non lo abbia detto, sarei disposto a scommettere che sarebbe preferibile una soluzione che producesse gli indici erranti in ordine ascendente. –

+0

@Linus: se lo vuoi, cambia le parentesi '{}' a '[]'. Questo ti darà una comprensione della lista invece di una comprensione dell'insieme, quindi conserva l'ordine. – katrielalex

4
>>> from itertools import izip 
>>> s1 = 'HELPMEPLZ' 
>>> s2 = 'HELPNEPLX' 
>>> [i for i,(a1,a2) in enumerate(izip(s1,s2)) if a1!=a2] 
[4, 8] 
18

Prova questa:

s1 = 'HELPMEPLZ' 
s2 = 'HELPNEPLX' 
[i for i in xrange(len(s1)) if s1[i] != s2[i]] 

tornerà:

> [4, 8] 

È possibile che questo soluzione restituirà una lista w con gli indici in ordine, non creerà alcuna struttura di dati intermedia non necessaria e funzionerà su Python 2.3 - 2.7. Per Python 3.x sostituire xrange per range.

+0

'zip' è un iteratore in Python 3. Non sai cosa intendi con il commento di Python 2.3. – katrielalex

+0

Significa che non usa funzionalità specifiche di Python 3 - come l'ipotesi che zip sia un iteratore, o che siano disponibili le impostazioni di comprensione. La mia soluzione funziona in modo efficiente anche nelle vecchie versioni di Python, purché siano disponibili le comprensioni delle liste –

+0

Le comprensibilità dei set sono in Python 2.7. – katrielalex

9

Python viene fornito con batterie incluse. Date un'occhiata a difflib

>>> import difflib 
>>> a='HELPMEPLZ' 
>>> b='HELPNEPLX' 
>>> s = difflib.SequenceMatcher(None, a, b) 
>>> for block in s.get_matching_blocks(): 
...  print block 
Match(a=0, b=0, size=4) 
Match(a=5, b=5, size=3) 
Match(a=9, b=9, size=0) 

difflib è molto potente e uno studio parte della documentazione è davvero consigliato.

Problemi correlati