查找字符串中最短的单词

时间:2018-07-12 20:32:49

标签: python

我是编码的新手,我正在研究一个问题,要求找到句子中最短的单词。我很困惑之间的区别:

def find_short(s):
    for x in s.split():
        return min(len(x)) 

def find_short(s):
    return min(len(x) for x in s.split())

是,因为前者给我一个错误,而后者似乎工作正常。他们实际上不是一回事吗?

5 个答案:

答案 0 :(得分:2)

  

他们实际上不是一回事吗?

不,它们不是一回事。如果s等于"hello world",则在第一次迭代中,x将是"hello"。这里有两件事是错误的:

  • 您正试图在第一次迭代中返回,而不是遍历所有元素(单词)以找出最短的元素。
  • min(len(x))就像说min(5)一样,这不仅是传递给min(..)的错误参数,而且没有任何意义。您希望传递一个元素列表,min将根据这些元素来计算最小值。

第二种方法实际上是正确的。 See this answer of mine了解如何解释它。简而言之,您正在计算每个单词的长度,将其放入列表(实际上是一个生成器),然后要求min对它进行最小计算。

有一种更简单的方法来查看第二个表达式为何起作用。尝试打印以下结果:

print([len(x) for x in s.split()])

答案 1 :(得分:1)

不,他们不是一回事。

在第一段代码中,您输入for周期并尝试计算第一个单词长度的minmin(5)没有意义,对吗?即使可以计算,return也会停止执行此函数(不会考虑其他单词的长度)。

在第二个单词中,len(x) for x in s.split()generator expression,它产生句子中所有单词的长度。 min将计算此序列的最小元素。

答案 2 :(得分:1)

函数min将数组作为参数。

在您的第一个街区上,您有

def find_short(s):
    for x in s.split():
        return min(len(x)) 

min在第一个单词的长度上被调用一次,因此由于期望数组而崩溃

您的第二个方块有点不同

def find_short(s):
    return min(len(x) for x in s.split())

在min里面,您有len(x) for x in s.split(),它将返回所有长度的数组并将其提供给min。然后,使用该数组,min将能够返回最小的数组。

答案 3 :(得分:1)

是的,给出的示例非常不同。

第一个示例有效地说明:

  

取字符串s,用空格分割,然后取每个单词x,找到并返回x长度的最小值

第二个示例有效地说明:

  

len(x) for x in s.split()生成的列表中查找最小值。

第一个示例会产生错误,因为min函数希望比较至少2个或更多元素,并且仅提供1个。

第二个示例之所以有效,是因为len(x) for x in s.split()生成的列表将一个字符串(如"Python types with ducks?"转换为一个单词长度列表(在我的示例中,它将字符串转换为{{1 }})。生成的列表(这也就是为什么它被称为生成器的原因)是[6, 5, 4, 6]函数随后用来在所述列表中查找最小值的原因。

写第一个示例,使其像您期望的那样工作的另一种方式是

min

但是,请注意在第二个示例中,如何跟踪不必使用列表生成器方法定义的变量。尽管这是您第一次学习编程时没什么大不了的,但是当您开始编写更大,更复杂的程序时,这将变得更大。

旁注:

关键字def find_short(s): min_length = float("inf") for x in s.split(): if len(x) < min_length: min_length = len(x) return min_length 之后的任何值都是函数“输出”的内容,因此不再执行任何代码。

例如,在您的第一个示例中(并假设未生成错误),无论您提供的字符串是什么,循环都只会执行一次,因为它不会真正检查您找到了想要的价值。我的意思是,每当您的代码遇到return语句时,即表示您的函数已完成

这就是为什么在我的示例return函数中,我有一条find_short语句要在提交到完全退出该功能的if语句之前检查是否具有所需的值

答案 4 :(得分:0)

这里主要有两个错误。

首先,似乎您正在返回字符串的长度,而不是字符串本身。

例如,您的函数将返回4而不是'book'。

我将简要介绍如何解决它。

但是回答您的问题:

min()是一个期望可迭代的函数(诸如数组之类的实体)。

在第一种方法中,您将拆分文本,并为每个单词调用return min(len(word))

因此,如果调用成功,它将在第一次迭代中返回。

但是它并不成功,因为min(3)抛出异常,3不可迭代。

第二种方法是创建min函数的参数列表。

因此,您的代码首先解析len(x) for x in s.split(),返回3、2、3、4、1、3、5之类的参数作为min的参数,这将返回最小值。

如果您想返回最短的单词,可以尝试:

def find_short(s):
    y = s.split()
    y.sort(key=lambda a: len(a))
    return y[0]