使用列表理解查找句子中最长单词的Python程序

问题描述 投票:0回答:2

假设我们已经获得了一条字符串。

s="This is my statement"

我们必须得到句子作为输出,这需要使用列表理解概念来解决。

我已经尝试了下面的代码,它给了我一个空列表。

longest_word=[i for i in s.split() if len(i) == max(s)]

为这个问题寻找一些有效的解决方案/建议。

python string list list-comprehension longest-substring
2个回答
0
投票

代码中的错误位于

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']

0
投票

我会选择类似的东西

[k:=w for i,w in enumerate(s.split()) if i==0 or len(w)>len(k)][-1]

不确定。这种练习,那更是程序员版的禁忌游戏,有规则。可能我无权使用

:=
。也许我被授权使用不止一根线......

与您的尝试相比,它的优点是一次通过。你的(由 Marcin Orlowski 纠正)有两个。

max
函数中的一个(隐式)用于查找最大的单词。然后,另一个,列表理解,选择与该长度匹配的单词。

就性能而言,它可能并不重要(

max
函数非常快,因为它是一个本机函数,可能是用C编写的。所以在相当慢的
for
之前调用它并不需要花费太多的理解列表)。 但是,由于这显然是一种游戏/挑战/练习,因此无论谁判断算法需要两次传递,而实际上只需要一次传递,这可能都很重要。

© www.soinside.com 2019 - 2024. All rights reserved.