繁体   English   中英

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

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

给定一个字符串列表,返回字符串长度为 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在循环内return count ,而不是在循环结束时return count 这就是为什么你总是得到1

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

  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)返回一个bool TrueFalse

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

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

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

  • 对于列表中的每个单词,它会测试match_end(word)返回True

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

    • 否则,它什么都不做(将 count 增加0 )。

  • 最后,它返回count

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM