计算两个字符串之间的差异

11

我想要计算两个导入的字符串(seq1和seq2,导入代码未列出)之间的差异数量,但是当运行程序时没有结果。我希望输出结果显示为“2个差异”。不确定哪里出了问题…

def difference (seq1, seq2):    
    count = 0
    for i in seq1:
        if seq1[i] != seq2[i]:
            count += 1
        return (count)
    print (count, "differences")

计数 = sum(1 for a, b in zip(seq1, seq2) if a != b) print(计数)非常好用! - Ryan Scott
5个回答

22
您可以使用生成器表达式来轻松完成此操作。
count = sum(1 for a, b in zip(seq1, seq2) if a != b)

如果序列长度不同,则可以将长度差视为内容差异(我会这样做)。在这种情况下,请添加额外的部分来解决此问题。
count = sum(1 for a, b in zip(seq1, seq2) if a != b) + abs(len(seq1) - len(seq2))

另一种奇怪的写法利用了“True”等于“1”和“False”等于“0”的特性,代码如下:True表示为1False表示为0
sum(a != b for a, b in zip(seq1, seq2))+ abs(len(seq1) - len(seq2))

zip 是 Python 的内置函数,可以同时迭代两个序列。它也会在最短的序列结束时终止,例如:

>>> seq1 = 'hi'
>>> seq2 = 'world'
>>> for a, b in zip(seq1, seq2):
...     print('a =', a, '| b =', b)
... 
a = h | b = w
a = i | b = o

这将类似于sum([1, 1, 1])的评估,其中每个1表示两个序列之间的差异。 if a != b过滤器会导致生成器仅在ab不同时产生值。请保留HTML标签。

1
在测试了“hey”和“hello”之后,它返回了“1”。 - GLHF
@howaboutNO 嗯,从 OP 的描述中看起来这些序列的长度是相同的,但你说得对,我会进行调整。 - Ryan Haining
请使用itertools.izip_longest :) - Hackaholic
@Hackaholic 针对字符串来说这个方法可行,但在筛选器中进行比较前需要进行额外的检查。 if a 不是 None 并且 b 不是 None 并且 a != b - Ryan Haining
第三行代码的结尾应该改为 abs(len(seq1) - len(seq2))。 - yukashima huksay
显示剩余2条评论

2
当您使用“for i in seq1”时,您正在遍历字符,而不是索引。您可以改用这种方式使用“enumerate”:“for i, ch in enumerate(seq1)”。
或者更好的方法是,使用标准函数“zip”同时遍历两个序列。
您也有一个问题,因为您在“print”之前“return”。可能需要将您的“return”下移并取消缩进。

1

在你的脚本中有两个错误

  1. "i" 应该是整数,而不是字符
  2. "return" 应该与 "print" 函数处于同一级别,而不是在循环 "for" 中
  3. 尽量不要在函数中以这种方式使用 "print"

以下是可工作的版本:

def difference (seq1, seq2):    
    count = 0
    for i in range(len(seq1)):
        if seq1[i] != seq2[i]:
            count += 1
    return (count)

0

正确的代码应该是:

def difference(seq1, seq2):
    count = 0
    for i in range(len(seq1)):
        if seq1[i] != seq2[i]:
            count += 1
    return count

首先,返回语句应该放在函数末尾,因此它不应是 for 循环的一部分,否则 for 循环只会运行一次。其次,for 循环不正确,因为你没有给出一个整数,因此正确的代码是给它一个 seq1 的长度范围,所以:

for i in range(len(seq1)):

0
所以我不得不做你要求做的事情,并想出了一个非常简单的解决方案。我的方法有点不同,因为我会检查字符串,看哪个更大,并将它们放入正确的变量中以备后续比较。全部用纯Python完成:
#Declare Variables
a='Here is my first string'
b='Here is my second string'
notTheSame=0
count=0

#Check which string is bigger and put the bigger string in C and smaller string in D
if len(a) >= len(b):
    c=a
    d=b
if len(b) > len(a):
    d=a
    c=b

#While the counter is less than the length of the longest string, compare each letter.
while count < len(c):
    if count == len(d):
        break
    if c[count] != d[count]:
        print(c[count] + " not equal to " + d[count])
        notTheSame = notTheSame + 1
    else:
        print(c[count] + " is equal to " + d[count])
    count=count+1

#the below output is a count of all the differences + the difference between the 2 strings
print("Number of Differences: " + str(len(c)-len(d)+notTheSame))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接