我下载了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
答案 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