迭代两个字符串,当相同索引处的字符匹配时返回计数

时间:2014-06-15 04:03:28

标签: python

我有两个单词,一个是用户输入字符串,另一个是从文本文件中随机选择的单词。我想返回两个stings中相等的计数值并共享相同的字符串索引。例如word1 ='bleed',word2 = slice:similar = 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

我是编程的新手,不幸的是我的尝试最大化了正确= 1.对于我在示例青蛙和朋友中使用的单词我希望看到正确= 2,我的代码生成正确= 1.如何做我加上正确,超过1?谢谢

5 个答案:

答案 0 :(得分:5)

使用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 (请参阅指针re:changes的注释):

>>> 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也将 strings 视为有序的字符列表,因此'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为您执行循环,并提供一个函数,该函数通过使用{{1}等函数返回将相等性应用于列表上的每个元组的结果。 }或filter()。在您的情况下,您希望map()在输入列表中运行并包含原始列表中的每个值,这些值导致传入函数的值(解决方案中的filter())为{{1 }}。 “已过滤”列表的长度基本上是匹配数。

希望这会有所帮助。请注意,如果您不熟悉Python,则需要在好书或official Python reference中查找列表/序列,元组,zip,过滤器和lambda以完全理解解决方案。

哦,欢迎编程: - )

答案 1 :(得分:2)

使用zip并理解:

word1 = 'frog'
word2 = 'friend'

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

答案 2 :(得分:2)

'reduce'的例子。

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

减少3个参数,

  • 使用累加器和列表中的每个项目调用的函数。
  • 列表。
  • 累加器的初始值。

累加器看起来像临时变量。但累加器的值被接管。

在我的代码中:

功能是The value of the accumulator is taken over.
列表为zip(word1, word2),因此[('f', 'f'), ('r', 'r'), ('o', 'i'), ('g', 'e')]
初始值为0

让我们看看减少是如何运作的。

第一次,使用参数z := 0, (x,y) := ('f', 'f')调用函数并返回1, 因为x == y为True且z + 1为1。

下次,使用参数z := 1, (x,y) := ('r', 'r')调用函数。 z是1,这就是重点,请记住累加器被接管。所以z是最后的结果。 在这段时间内,x == y也是正确的。函数返回2(z + 1)。

下次,使用2, ('o', 'i')调用会返回2。 ('o'不是'我')。

最后,调用2, ('g', 'e')会返回2

这就是全部,结果是2。

答案 3 :(得分:1)

正如user2347112在评论中所述,使用zip()内置功能可以轻松完成此任务:

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

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

print(correct)

答案 4 :(得分: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