“2弦之间的距离”

时间:2017-05-02 18:50:38

标签: python python-3.x

嗨,这是来自之前的测试,我想知道如何做到这一点 谢谢 我们可以将两个字符串之间的距离定义为相应的位置数 人物不同。例如,字符串“find”和“fund”之间的距离是1,因为只有

编写一个程序,它将从用户输入两个字符串,并确定并输出距离 字符串之间,即每个字符串的相应位置中有多少个字符, 是不同的。您的程序必须只输出上面定义的距离。

“karolin”“kathrin”距离3个位置2,3,4 “karolin”“Kerstin”距离3个位置1,3,4等 “1011101”“1001001”2 2,4 “2173896”“2233796”3 1,2,4 “ABCD”“ABCDEF”2 4,5 “efghi”“efg”2 3,4 “快!”“快?”1 9

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案如下:

>>> s1 = "karolin"
>>> s2 = "kathrin"

>>> distance = sum([1 for x, y in zip(s1, s2) if x.lower() != y.lower()])
>>> distance
3

s1s2定义您将使用的字符串。您可以分别使用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条件。