如何return有特定要求的字符串在列表中出现的次数?

How to return the number of times a string with specific requirements appears in a list?

给定一个字符串列表,return字符串长度为3或更多且字符串的第一个和最后一个字符相同的字符串的数量。

为了解决这个问题,我创建了以下函数,

def match_ends(words):
  FirstL=words[0:1]
  LastL=words[-1:]
  x=len(words)>3 and FirstL == LastL
  count=0
 for x in words:
    count+=1
    return count

然后在这里测试了一下,

def test(got, expected):
  if got == expected:
    prefix = ' OK '
  else:
    prefix = '  X '
  print ('%s got: %s expected: %s' % (prefix, repr(got), repr(expected)))


# Calls the above functions with interesting inputs.
def main():
  print ('match_ends')
  test(match_ends(['abaa', 'xyzax', 'aa', 'x', 'bbb']), 3)
  test(match_ends(['', 'x', 'xy', 'xyx', 'xx']), 1)
  test(match_ends(['aaa', 'be', 'abc', 'hello']), 1)


  print

结果:

X  got: 1 expected: 3
OK  got: 1 expected: 1
OK  got: 1 expected: 1

你这里有几个问题:

  1. 当你遍历每个单词时,你 return count 在循环中,而不是在循环结束时结束。这就是为什么你总是得到 1

  2. 总是count += 1即使xFalse

  3. x 取列表的第一项和最后一项,而不是列表中每个单词的第一个和最后一个字母。

  4. 最后你在 for 循环中隐藏了 bool x


提示

为什么不把它分成两个功能?

def match_end(word):
    first, last = word[0], word[-1:]
    return True if first == last and len(word) >= 3 else False

def match_ends(words):
    count = 0
    for word in words:
        count += 1 if match_end(word) else 0
    return count

第一个函数,match_end(word) returns TrueFalsebool

  • 首先,它通过切片将变量firstlast设置为字符串的第一个和最后一个字母。

  • 接下来,returns True如果第一个字母和最后一个字母相同,并且单词的长度小于三个。否则,它 returns False。这是通过 Python 的 Ternary Operator.

  • 完成的

第二个函数 match_ends(words) 接受一个字符串列表(就像您原来的那样),遍历 list 中的每个单词。

  • 对于列表中的每个单词,它会测试是否 match_end(word) returns True.

    • 如果是这样,它会将计数增加 1

    • 否则,它什么也不做(增量计数 0)。

  • 终于returnscount.

这里最好的选择是使用列表理解。列表理解包含三个部分:

  • 要对输入的每个元素执行的转换,
  • 输入本身,并且
  • 指示何时产生输出的可选"if"语句

例如,我们可以说

[ x * x               # square the number
for x in range(5) ]  # for each number in [0,1,2,3,4]  `

这将生成列表

[0 1 4 9 16]

我们可以添加第三行(过滤),只返回奇数:

[x * x
for x in range(5) 
if x % 2]     # divide x by 2, take the remainder -- if 1, output the number`

在您的特定情况下,我们不关心转换部分。我们只想输出符合您标准的单词:

[word
 for word in word_list
 if len(word) >= 3 and word[0] == word[-1] ]

这会给你一个列表。现在您只需要获取该列表的长度:

len( [word
 for word in word_list
 if len(word) >= 3 and word[0] == word[-1] ]  )

想把它变成一个函数吗?给你:

def count_matching_words(word_list):
    return len([word
                for word in word_list
                if len(word) >= 3 and word[0] == word[-1]])