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

2024-10-03 11:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个字符串列表,返回字符串长度为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

Tags: 字符串testprefixdefmatchcountokexpected
2条回答

你最好的办法是使用列表理解。列表包含三个部分:

  • 要对输入的每个元素执行的转换
  • 输入本身,以及
  • 一个可选的“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]])

这里有一些问题:

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

  2. 你总是count += 1,即使xFalse

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

  4. 最后,将boolx隐藏在for循环中。


提示

为什么不把它分成两个功能呢?你知道吗

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)返回boolTrueFalse。你知道吗

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

  • 接下来,如果第一个字母和最后一个字母相同,并且单词的长度小于三个,那么它就是returnsTrue。否则,它是returnFalse。这是用Python的Ternary Operator完成的。

第二个函数match_ends(words)包含一个字符串列表(与原来的一样),它迭代list中的每个单词。你知道吗

  • 对于列表中的每个单词,它将测试match_end(word)是否返回True。你知道吗

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

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

  • 最后,它返回count

相关问题 更多 >