2014-06-15 24 views
2

我有两个单词,一个是用户输入字符串,另一个是从文本文件中随机选择的单词。我想返回两个刺激中相等的计数值并共享相同的字符串索引。如字词1 =“出血”,单词2 =切片:相似= 1迭代两个字符串,当同一索引匹配的字符匹配时返回count

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

'= +'不'+ =',''==实际上并没有做任何事情,如果你把它改为'=',它会做错事。 – user2357112

+0

您正在使用运算符'+ ='不正确。你的代码总是正确接收'+ 1'而不是递增。 – Mephy

+3

而不是range-len迭代,只需使用'zip'即可。它会在最短输入序列的末尾自动停止,这正是您想要的。 – user2357112

回答

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都有(见指针意见重新:改变):

>>> 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不熟悉,则需要在一本好书或official Python reference中查找列表/序列,元组,压缩文件,筛选器和lambda以充分了解解决方案。

哦,欢迎到编程:-)

+0

谢谢你的时间,我真的很感谢你的广泛答案!我尝试着使用这个函数,并在lambda突出显示后用左圆括号得到错误'invalid syntax'。任何想法,为什么会这样? – user3636636

+1

嗯,看起来像我运行这个的Python 2.7和Python 3的区别,它会给出你指出的错误。不知道什么样的语法发生了变化 - 让我深入研究。你碰巧在你的机器上安装了Python 2吗?对于我在Ubuntu上,这只是'python'。 – scorpiodawg

+1

好吧,这里的问题:在Python 3中更改元组自动解包:http://stackoverflow.com/questions/15712210/python-3-2-lambda-syntax-error。仍然看到与打印语句的错误,现在过滤器返回一个可迭代但不是直上的列表:http://stackoverflow.com/questions/12319025/filters-in-python。我会用正确的Python 3等效来更新答案。 – scorpiodawg

1

由于user2347112在评论中指出,这个任务可以轻松的完成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 
+0

你可以用你的if语句直接替换'1',就像这样:'sum(a == b for a,b in zip('frog','friend'))' –

2

使用zip和理解:对于 '降低'

word1 = 'frog' 
word2 = 'friend' 

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

不需要内部列表,你也不需要'1':'sum(l == r for l,r in zip('frog','friend'))' –

2

例子。

>>> 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

+1

如果你解释为什么它可以工作 –

+0

@凯特感谢你的建议。我试着写解释。 –