为什么'追加'我的Python代码没有按预期工作?

时间:2017-01-15 15:18:09

标签: python append

我下载了Google的Python练习,这是其中一个问题:

  

给定一个字符串列表,返回字符串数的计数   字符串长度为2或更多,以及字符串的第一个和最后一个字符   字符串是相同的

我对此的回答如下:

def match_ends(words):
  a=[]
  for word in words:
    if len(word)>=2 and word[0]==word[-1]:
      a=a.append(word)
    return len(a)

但是,对于此列表:

words=['aba', 'xyz', 'aa', 'x', 'bbb']

它只返回" 1"。我不明白为什么append没有添加与转弯相匹配的所有字符串。

这是Google的解决方案:

def match_ends(words):
  count = 0
  for word in words:
    if len(word) >= 2 and word[0] == word[-1]:
      count = count + 1
  return count

2 个答案:

答案 0 :(得分:4)

这里有两个问题:

  • 缩进问题:
def match_ends(words):
  a=[]
  for word in words:
    if len(word)>=2 and word[0]==word[-1]:
      a=a.append(word)
    return len(a)

return语句在<{1}}循环中放置,这意味着只需一次迭代后,您将返回一个答案(零或一)。所以你可以解决这个问题:

def match_ends(words):
  a=[]
  for word in words:
    if len(word)>=2 and word[0]==word[-1]:
      a=a.append(word)
  return len(a)
  • 此外,您将for的结果分配给a.append(word).append然后返回a(实际上None没有返回任何内容,因此Python让它自动返回.append),因此下一次迭代None不是a了,程序会崩溃。因此,将list替换为a = a.append(word)
def match_ends(words):
  a=[]
  for word in words:
    if len(word)>=2 and word[0]==word[-1]:
      a.append(word)
  return len(a)

现在你的程序会运作。然而,无法存储所有匹配的单词,因为您只对计算它们感兴趣。如果找到匹配项,最好使用计数器并递增计数器,因为这不需要额外的内存。 Google的答案因此更有效

答案 1 :(得分:1)

像这样缩进你的退货声明:

for word in words:
    if len(word)>=2 and word[0]==word[-1]:
        a.append(word)
return len(a)

当您将其放置在if级别时,它会将列表a的长度打印为现在包含['a']为1(对于它发现的第一个单词,验证为true第一个和最后一个字母相同)并退出,因为它是return语句。该循环不会验证列表words中的任何其他字词。

编辑答案,因为我没有注意到作业。 append函数不需要赋值。谢谢@Willem