it-swarm-pt.tech

Encontre a posição da diferença entre duas cordas

Eu tenho duas cadeias de comprimento igual. Como posso encontrar todos os locais em que as cadeias são diferentes?

Por exemplo, "HELPMEPLZ" e "HELPNEPLX" são diferentes nas posições 4 e 8.

17
Linus Svendsson

Tente o seguinte:

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

Voltará:

> [4, 8]

A solução acima retornará uma lista com os índices na ordem classificada, não criará estruturas de dados intermediárias desnecessárias e funcionará em Python 2.3 - 2.7. Para Python 3.x substitua xrange por range.

25
Óscar López

Python realmente vem com baterias incluídas. Dê uma olhada em 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 é muito poderoso e um pouco de estudo da documentação é realmente recomendado.

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

Se você armazenar as duas cadeias em a e b, poderá percorrer todos os itens e verificar se há desigualdade.

intérprete interativo python:

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

Outra maneira de fazer isso é com a compreensão da lista. Está tudo em uma linha e a saída é uma lista.

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

Isso facilita muito o agrupamento em uma função, o que facilita a chamada em uma variedade de entradas.

>>> 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]
2
Brigand

A maneira mais fácil é dividir os dados em duas matrizes de caracteres e, em seguida, percorrer a comparação das letras e retornar o índice quando os dois caracteres não se igualam.

Este método funcionará bem desde que as duas seqüências tenham o mesmo comprimento.

1
Dobbo1989

Emparelhe as cadeias de caracteres por caractere e itere sobre essa coleção junto com um índice de contagem. Teste se os caracteres em cada par diferem; se o fizerem, produza o índice de onde.

Usando as funções internas Python, você pode fazer isso ordenadamente em uma linha:

>>> x = 'HELPMEPLZ'
>>> y = 'HELPNEPLX'
>>> {i for i, (left, right) in enumerate(Zip(x,y)) if left != right}
{8, 4}
1
Katriel