嗨,这是来自之前的测试,我想知道如何做到这一点 谢谢 我们可以将两个字符串之间的距离定义为相应的位置数 人物不同。例如,字符串“find”和“fund”之间的距离是1,因为只有
编写一个程序,它将从用户输入两个字符串,并确定并输出距离 字符串之间,即每个字符串的相应位置中有多少个字符, 是不同的。您的程序必须只输出上面定义的距离。
答案 0 :(得分:0)
一个简单的解决方案如下:
>>> s1 = "karolin"
>>> s2 = "kathrin"
>>> distance = sum([1 for x, y in zip(s1, s2) if x.lower() != y.lower()])
>>> distance
3
s1
和s2
定义您将使用的字符串。您可以分别使用input3()和raw_input(Python3和2)从用户处获取这些内容。
现在sum([1 for x, y in zip(s1, s2) if x.lower() != y.lower()])
中的代码首当其冲:
Zip()将输入“压缩”在一起,将每个输入的相应元素分组在一起。在这种情况下,zip(s1, s2)
会给我们('k', 'k'), ('a', 'a'), ('r', 't'), ('o', 'h'), ('l', 'r'), ('i', 'i'), ('n', 'n')
。
x, y in zip
将遍历这些配对,将x
分配给第一个条目,y
分配给第二个条目。
然后我们将它们与if
语句if x.lower() != y.lower()
进行比较。我们使用.lower()
将字符转换为小写字母;否则,'k'和'K'将被视为不相等。 (您也可以在输入后立即在字符串上调用lower()
。)
方括号[..]
内的所有内容称为列表推导。既然您现在理解了子部分,那么它就是说“如果x和y不是同一个字母,则在压缩列表中为每个x,y对插入一个1
”。
这给了我们一个包含一堆整数1
的列表,在本例中为[1,1,1]。 1
表示相应字符的每个差异。因此,要获得差异总数,我们只需在整个列表中调用sum()
即可将所有这些值相加。
答案 1 :(得分:0)
您可以使用difflib.SequenceMatcher
。它不会列出字符串相同的每个索引,但会给出每个相同块的起始索引和长度。
import difflib
str1 = "This is the first string"
str2 = "This is the second string"
s = difflib.SequenceMatcher(None, str1, str2)
for block in s.get_matching_blocks():
i1, i2, length = block
if i1 == i2 and length != 0:
print(f'str1[{i1}] and str2[{i2}] for {length} elements')
注意:如果匹配序列不必从同一索引开始,则从i1 == i2
语句中删除if
条件。