2011-12-17 63 views
9

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

例如,「HELPMEPLZ」和「HELPNEPLX」是在第4和第8

+0

看起來對我來說是功課。顯示你的嘗試和你遇到的問題,然後嘗試提出具體的問題 – tback 2011-12-17 14:50:41

+0

這不是作業,我需要它來做一個更大的功能複合體。因此,在這裏寫下所有內容有點困難.. – 2011-12-17 14:53:13

+0

但是函數分割字符串: ('HEL','PME','PLZ')和('HEL','PNE','PLX') – 2011-12-17 14:55:48

回答

2

不同如果兩個字符串存儲在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] 
+0

當你不必使用lambda時:'def dif(a,b):return [i爲範圍內的我(len(a))如果a [i]!= b [i]]' – 2011-12-17 15:30:45

+0

@StevenRumbalski,爲什麼不呢?就我所知,它完全一樣。它是不是Pythonic?或更慢? – FakeRainBrigand 2011-12-17 15:41:50

+0

Lambdas用於*匿名*功能,非常適合創建一個襯墊。在這裏,你給lambda指定了一個名字,這表明它會比常規函數更好。此外,當你有一個bug時,lambda會隱藏你的追蹤。 – 2011-12-17 17:08:20

1

最簡單方法是通過比較所述字母當兩個字符不等於彼此分割數據爲兩個字符數組,然後循環並返回的索引。

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

1

將字符串逐個字符地配對,並將其與計數索引一起迭代到該集合上。測試每對中的字符是否不同;如果他們這樣做,輸出where的索引。

使用Python內建函數可以在一行整齊地做到這一點:

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

雖然OP沒有這麼說,但我願意打賭,一個解決方案以升序的方式產生錯誤的索引將是更可取的。 – 2011-12-17 20:55:20

+0

@Linus:如果你想要這個,把括號改爲'[]'。這會給你一個列表理解而不是一個集合理解,所以保留了順序。 – katrielalex 2011-12-17 21:16:17

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

試試這個:

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

它將返回:

> [4, 8] 

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

+0

'zip'是Python 3中的一個迭代器。不確定Python 2.3是什麼意思。 – katrielalex 2011-12-17 15:08:20

+0

這意味着它不使用Python 3特有的功能 - 比如假設zip是一個迭代器,或者集合解析是可用的。只要列表解析可用,我的解決方案即使在較老的Python版本中也能有效工作 – 2011-12-17 15:22:12

+0

集合解析在Python 2.7中。 – katrielalex 2011-12-17 16:28:55

9

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是非常強大的,真的是推薦的文檔的一些研究。

相關問題