如何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
你这里有几个问题:
当你遍历每个单词时,你 return
count
在循环中,而不是在循环结束时结束。这就是为什么你总是得到 1
。
你总是count += 1
即使x
是False
。
x
取列表的第一项和最后一项,而不是列表中每个单词的第一个和最后一个字母。
最后你在 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 True
或 False
的 bool
。
首先,它通过切片将变量first
和last
设置为字符串的第一个和最后一个字母。
接下来,return
s True
如果第一个字母和最后一个字母相同,并且单词的长度小于三个。否则,它 return
s 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]])
给定一个字符串列表,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
你这里有几个问题:
当你遍历每个单词时,你
return
count
在循环中,而不是在循环结束时结束。这就是为什么你总是得到1
。你总是
count += 1
即使x
是False
。x
取列表的第一项和最后一项,而不是列表中每个单词的第一个和最后一个字母。最后你在
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 True
或 False
的 bool
。
首先,它通过切片将变量
first
和last
设置为字符串的第一个和最后一个字母。接下来,
return
sTrue
如果第一个字母和最后一个字母相同,并且单词的长度小于三个。否则,它return
sFalse
。这是通过 Python 的 Ternary Operator. 完成的
第二个函数 match_ends(words)
接受一个字符串列表(就像您原来的那样),遍历 list
中的每个单词。
对于列表中的每个单词,它会测试是否
match_end(word)
returnsTrue
.如果是这样,它会将计数增加
1
。否则,它什么也不做(增量计数
0
)。
终于returns
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]])