我有两个相等长度的字符串,如何找到字符串不同的所有位置?
例如,“HELPMEPLZ”和“HELPNEPLX”在第4和第8位是不同的。
答案 0 :(得分:22)
试试这个:
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
。
答案 1 :(得分:11)
>>> 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
非常强大,我们建议对文档进行一些研究。
答案 2 :(得分:4)
>>> from itertools import izip
>>> s1 = 'HELPMEPLZ'
>>> s2 = 'HELPNEPLX'
>>> [i for i,(a1,a2) in enumerate(izip(s1,s2)) if a1!=a2]
[4, 8]
答案 3 :(得分:2)
如果您将两个字符串存储在a
和b
中,则可以遍历所有项目并检查不等式。
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]
答案 4 :(得分:1)
最简单的方法是将数据拆分为两个char数组,然后循环比较字母,并在两个字符彼此不相等时返回索引。
只要两个字符串的长度相等,此方法就可以正常工作。
答案 5 :(得分:1)
逐个字符地对齐字符串,并使用计数索引迭代此集合。测试每对中的字符是否不同;如果他们这样做,输出where的索引。
使用Python内置函数,您可以在一行中巧妙地完成此任务:
>>> x = 'HELPMEPLZ'
>>> y = 'HELPNEPLX'
>>> {i for i, (left, right) in enumerate(zip(x,y)) if left != right}
{8, 4}
答案 6 :(得分:0)
根据@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'