遍历两个字符串,当相同索引字符匹配时返回计数
我有两个单词,一个是用户输入的字符串,另一个是从文本文件中随机选出的单词。我想要返回这两个字符串中相同位置的相同字符的数量。例如,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 个回答
正如用户2347112在评论中提到的,这个任务可以很简单地通过内置的 zip()
函数来完成:
word1 = 'frog'
word2 = 'friend'
correct = 0
for i,j in zip(word1,word2):
if i == j:
correct+=1
print(correct)
首先,=+
应该改成 +=
,这样才能正确地增加 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
这是一个关于'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。
使用 zip
和列表推导式:
word1 = 'frog'
word2 = 'friend'
sum([1 for (l,r) in zip(word1, word2) if l == r])
使用 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 的列表相关操作符和内置函数。所以你的问题就变成了把 word1
和 word2
当作列表来处理,找到这些列表中相同项目的索引。
所以我们来用 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 参考,以便更好地理解这个解决方案。
哦,欢迎来到编程的世界 :-)