在字符串中寻找最短的单词

5

我是一名编程新手,正在解决一个问题,要求在句子中找到最短的单词。我不明白以下两种方法的区别:

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

and

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

因为前者给我一个错误,而后者似乎工作正常。它们不是基本上相同的东西吗?


你是想找到最短的单词,例如 'dog',还是最短单词的长度,例如 3 - Alex Hall
3
两个特征都包含循环。然而,第一个循环不起作用,因为它每次只查看一个值。第二个创建了一个生成器,其中包含所有的值,然后输出该生成器中最小的值。 - W Stokvis
5个回答

3
他们不是同一件事吗?
不,它们不是同一件事。如果s等于“hello world”,在第一次迭代中,x将是“hello”。这里有两个问题:
1. 你试图在第一次迭代中返回而不是遍历所有元素(单词)以找出最短的。
2. min(len(x))就像是min(5),不仅是传递给min(..)的坏参数,而且没有意义。您需要传递一个元素列表,min将从中计算最小值。
第二种方法是正确的。参见我的答案,了解如何解释它。简而言之,你正在计算每个单词的长度,将其放入列表(实际上是生成器),然后要求min对其运行最小计算。
有一种更简单的方法可以看到为什么你的第二个表达式有效。尝试打印以下结果:
print([len(x) for x in s.split()])

1
不,它们不是同一件事。
在第一个代码片段中,您正在输入for循环,并尝试计算第一个单词长度的最小值。min(5)没有意义,对吗?即使可以计算,return也会停止执行此函数(其他单词的长度将不会被考虑)。
在第二个代码片段中,len(x) for x in s.split()是生成器表达式,产生您句子中所有单词的长度。而min将计算此序列的最小元素。

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 将能够返回最小值。

1
是的,所给出的例子非常不同。

 

第一个示例有效地说明:

取字符串s,按空格分割,然后取每个单词x,返回仅包含x长度的最小值。

 

第二个例子的意思是:

在由s.split()生成的列表中找到len(x)的最小值。

 

那个第一个例子出现错误是因为min函数需要比较至少2个或以上的元素,但只提供了1个。
而第二个例子可以运行,因为由len(x) for x in s.split()生成的列表将字符串转换为单词长度列表(例如,它会将字符串转换为[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 语句来检查我是否拥有我想要的值,然后才会提交到完全退出函数的 return 语句。


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这样的参数列表,然后返回最小值。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接