遍历两个字符串,当相同索引字符匹配时返回计数

5 投票
5 回答
14093 浏览
提问于 2025-04-18 09:49

我有两个单词,一个是用户输入的字符串,另一个是从文本文件中随机选出的单词。我想要返回这两个字符串中相同位置的相同字符的数量。例如,word1 = 'bleed',word2 = 'slice',那么相同的字符数量就是1。

word1 = 'frog'
word2 = 'friend'
correct = 0

if len(word1) > len(word2):
    for i in range(len(word2)):
        if word1[i] == word2[i]:
            correct =+ 1
        else:
            correct == 0

else:
   for i in range(len(word1)):
       if word1[i] == word2[i]:
           correct =+ 1
       else:
           correct == 0

我刚开始学编程,不幸的是,我的尝试结果是correct = 1。对于我在例子中用的单词frog和friend,我本来希望看到correct = 2,但我的代码只给出了correct = 1。我该如何让correct的值超过1呢?谢谢!

5 个回答

1

正如用户2347112在评论中提到的,这个任务可以很简单地通过内置的 zip() 函数来完成:

word1 = 'frog'
word2 = 'friend'
correct = 0

for i,j in zip(word1,word2):
    if i == j:
        correct+=1

print(correct)
1

首先,=+ 应该改成 +=,这样才能正确地增加 correct 的值。另外,你的 else 语句可以去掉,因为它们没有任何作用。

正如评论中提到的,你应该了解一下 zip 这个函数。

In [1]: word1 = 'frog'

In [2]: word2 = 'friend'

In [3]: sum(1 for a, b in zip(word1, word2) if a == b)
Out[3]: 2
2

这是一个关于'reduce'的例子。

>>> word1 = 'frog'
>>> word2 = 'friend'
>>> reduce(lambda z,(x,y): (z+1) if x == y else z, zip(word1,word2), 0)
2

reduce函数需要三个参数:

  • 一个函数,这个函数会用到一个累加器和列表中的每个项目。
  • 一个列表。
  • 累加器的初始值。

累加器就像一个临时变量,但它的值会被不断更新。

在我的代码中:

函数是 累加器的值会被更新。
列表是 zip(word1, word2),所以结果是 [('f', 'f'), ('r', 'r'), ('o', 'i'), ('g', 'e')]
初始值是 0。

现在我们来看看reduce是怎么工作的。

第一次调用时,函数的参数是 z := 0, (x,y) := ('f', 'f'),返回值是 1,因为 x == y 为真,所以 z + 1 等于 1。

下一次调用时,参数是 z := 1, (x,y) := ('r', 'r')。此时 z 是 1,记住累加器的值会被更新,所以 z 是上一次的结果。这次 x == y 也为真,函数返回 2(z + 1)。

再下一次,调用时参数是 2, ('o', 'i'),返回 2。(因为 'o' 不等于 'i')。

最后一次,调用时参数是 2, ('g', 'e'),返回 2

就这样,最终结果是 2。

3

使用 zip 和列表推导式:

word1 = 'frog'
word2 = 'friend'

sum([1 for (l,r) in zip(word1, word2) if l == r])
9

使用 zip()filter() 这两个内置函数会简单很多:

Python 2.x:

In [23]: word1 = 'frog'
In [24]: word2 = 'friend'
In [25]: print len(filter(lambda (x, y): x == y, zip(word1, word2)))
2

Python 3.x(关于变化的提示请查看评论):

>>> word1 = 'frog'
>>> word2 = 'friend'
>>> len(list(filter(lambda xy: xy[0] == xy[1], zip(word1, word2))))
2

更新:既然你是编程新手,我来尝试解释一下这个解决方案:

Python 支持序列(通常可以理解为有序的项目列表),比如 [1,2,3]['a', 'b', 'c', 123, 456]。不过,Python 也把 字符串 当作有序的字符列表来看待,所以 'hello world' 也是一个列表。因此,你可以在字符串上使用 Python 的列表相关操作符和内置函数。所以你的问题就变成了把 word1word2 当作列表来处理,找到这些列表中相同项目的索引。

所以我们来用 Python 的特殊函数来解决这个问题。zip 是一个很方便的函数,它可以接受多个序列,并生成一个新列表,每个列表中的第 X 个项目由输入序列中第 X 个项目的值组成。例如,zip([1,2], [3,4]) 会变成 [(1,3), (2,4)],而 zip('foo', 'bar') 会变成 [('f', 'b'), ('o', 'a'), ('o', 'r')]。这个最后的结果对你的问题非常有用——现在你只需要对每个元组(也就是形如 (x,y) 的值)运行一个函数,检查这些值是否相等。你可以像其他语言那样用循环来实现,但你也可以让 Python 为你处理循环,只需提供一个函数,返回对列表中每个元组应用相等性检查的结果,使用 filter()map() 这样的函数。在你的情况下,你需要 filter(),它会遍历输入列表,并包含每个在原始列表中使传入函数(解决方案中的 lambda)返回 True 的值。经过“过滤”的列表的长度就是匹配的数量。

希望这对你有帮助。如果你是 Python 新手,建议查阅一本好的书,了解列表/序列、元组、zip、filter 和 lambda,或者查看 官方 Python 参考,以便更好地理解这个解决方案。

哦,欢迎来到编程的世界 :-)

撰写回答