2011-12-17 64 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是非常强大的,真的是推荐的文档的一些研究。

相关问题