簡體   English   中英

找到兩個字符串之間的差異位置

[英]Find the position of difference between two strings

我有兩個長度相等的字符串,如何找到字符串不同的所有位置?

例如,“HELPMEPLZ”和“HELPNEPLX”在位置 4 和 8 處不同。

嘗試這個:

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

它將返回:

> [4, 8]

上述解決方案將按排序順序返回一個包含索引的列表,不會創建任何不必要的中間數據結構,並且可以在 Python 2.3 - 2.7 上運行。 對於 Python 3.x,將xrange替換為range

Python 確實附帶了電池。 看看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非常強大,真的建議對文檔進行一些研究。

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

如果將兩個字符串存儲在ab ,則可以遍歷所有項目並檢查不等式。

python交互式解釋器:

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

另一種方法是使用列表推導式。 全部在一行中,輸出是一個列表。

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

這使得包裝成一個函數變得非常容易,這使得在各種輸入上調用它變得容易。

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

將字符串逐個字符配對,並與計數索引一起迭代此集合。 測試每對中的字符是否不同; 如果有,輸出 where 的索引。

使用 Python 內置函數,您可以在一行中巧妙地完成此操作:

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

根據@FredrikPihl 指出的方向,這里有一個解決方案,它也能夠使用 Python 標准庫中的模塊檢測插入/刪除:

import difflib
a = 'HELPMEPLZ'
b = 'HELPNEPLX'
s = difflib.SequenceMatcher(None, a, b, autojunk=False)
for tag, i1, i2, j1, j2 in s.get_opcodes():
    if tag != 'equal':
        print('{:7}   a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(
            tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))

隨着輸出:

replace   a[4:5] --> b[4:5]      'M' --> 'N'
replace   a[8:9] --> b[8:9]      'Z' --> 'X'

讓我們看看它如何與一個類似的例子一起工作,包括刪除和添加:

a = 'HELPMEPLZ'
b = 'HLP NEE PLX'

隨着輸出:

delete    a[1:2] --> b[1:1]      'E' --> ''
replace   a[4:5] --> b[3:5]      'M' --> ' N'
insert    a[6:6] --> b[6:8]       '' --> 'E '
replace   a[8:9] --> b[10:11]      'Z' --> 'X'

最簡單的方法是將數據拆分為兩個字符數組,然后循環比較字母並在兩個字符不相等時返回索引。

只要兩個字符串的長度相等,此方法就可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM