假设我们已经获得了一条字符串。
s="This is my statement"
我们必须得到句子作为输出,这需要使用列表理解概念来解决。
我已经尝试了下面的代码,它给了我一个空列表。
longest_word=[i for i in s.split() if len(i) == max(s)]
为这个问题寻找一些有效的解决方案/建议。
代码中的错误位于
max(s)
表达式中。以这种方式使用时, max()
返回字符串 s
中具有最高 ASCII 值的字符,而不是您错误假设的最长单词的长度。因此,当您比较 len(i) == max(s)
时,您是将当前单词 i
的长度与 s
中的字符进行比较,这没有什么意义,因为一个字符(本质上是一个长度为 1 的字符串)和一个单词(对于除单个字符之外的任何单词都大于 1)永远不会相等,比较结果将始终为 False
,这就是为什么你得到空列表。
要查找字符串中最长的单词
s
可以使用 max()
一个 key
参数来构造,其中我们传递 len
函数用于比较长度,以及列表理解来处理多个相同最大长度的单词:
longest_word_length = max(len(word) for word in s.split())
longest_word = [word for word in s.split() if len(word) == longest_word_length]
或作为单行
longest_word = [word for word in s.split() if len(word) == len(max(s.split(), key=len))]
测试用例:
s = "This is my statement"
longest_word = [word for word in s.split() if len(word) == len(max(s.split(), key=len))]
print(longest_word)
会产生:
$ python test.py
['statement']
我会选择类似的东西
[k:=w for i,w in enumerate(s.split()) if i==0 or len(w)>len(k)][-1]
不确定。这种练习,那更是程序员版的禁忌游戏,有规则。可能我无权使用
:=
。也许我被授权使用不止一根线......
与您的尝试相比,它的优点是一次通过。你的(由 Marcin Orlowski 纠正)有两个。
max
函数中的一个(隐式)用于查找最大的单词。然后,另一个,列表理解,选择与该长度匹配的单词。
就性能而言,它可能并不重要(
max
函数非常快,因为它是一个本机函数,可能是用C编写的。所以在相当慢的for
之前调用它并不需要花费太多的理解列表)。
但是,由于这显然是一种游戏/挑战/练习,因此无论谁判断算法需要两次传递,而实际上只需要一次传递,这可能都很重要。