我有两个单词,一个是用户输入字符串,另一个是从文本文件中随机选择的单词。我想返回两个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?谢谢
答案 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的与列表相关的运算符/内置函数。因此,您的问题会缩减为将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为您执行循环,并提供一个函数,该函数通过使用{{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