如何在姓名列表中找到最长的姓名?

3

以下是说明(请耐心等待,这是我第一周尝试在Python中编写非常简单的函数)。我找到的每个例子都使用了我的班级之前没有使用过的东西。

“定义一个名为longest_word(list_of_words)的函数,此函数接受一个单词列表,例如['apple', 'orange', 'banana'],并返回最长的单词。如果有多个单词长度相同,则返回第一个单词。

a. 例如,如果您按照下面的代码调用函数,则应该得到指示的输出:

word_list = [ 'apple' , 'orange' , 'banana' ]
result = longest_word(word_list)
print(result)"

所以在许多失败的尝试之后,我尝试了这个:

list_of_words = ['antman','spiderman','blackwidow','thor']
word_list_long = []

def longest_word(list_of_words):
    for word in list_of_words:
        if len(word) > len(word_list_long):
            word.append(word_list)
            len(word) != len(word_list_long)
    return word_list

result = word_list_long
print(result)

结果是[],期望输出是blackwidow


1
你从未调用longest_word函数,因此代码从未执行。 - mousetail
2
其他问题:您返回变量word_list,但从未为其分配值。您尝试附加字符串word,它无法修改。您从未使用比较结果len(word)!= len(word_list_wrong) - mousetail
2
逐行查看您的函数,并添加注释以说明每行的作用。这应该有助于您理解函数的运作。 - mousetail
5个回答

5
word_list = ['apple', 'orange', 'banana']
def longest_word(word_list):
    return max(word_list, key=len)
print(longest_word(word_list))

这个应该能够工作,这个只有一行的函数可以满足您的所有需求。


3

这些注释解释了每行代码的作用!

list_of_words = ['antman','spiderman','blackwidow','thor']
def longest_word(list_of_words):
    longest = 0; #No Of Characters in longest word
    longestword = "" #The Longest Word
    for word in list_of_words: # For Loop to iterate through words
        if len(word) > longest: #Check If the length of word is greater than current longest word
            longest = len(word)  #If So make the new longest length as length of the word
            longestword = word # And make the longest word as the word
    return longestword #Return The longest word
print(longest_word(list_of_words))

2
我知道你刚开始学习编程不到一周,现在介绍这个可能有些早了,但是你可以使用functools.reduce在一行代码中实现相同的功能。请注意保留HTML标签。
>>> from functools import reduce
>>> l = ["1", "12", "123", "1234", "123", "12", "1"]
>>> reduce(lambda x, y: x if len(x) > len(y) else y, l)
'1234'

functools.reduce(function, iterable[, initializer])

将二元函数 cumulatively 应用于 iterable 的项,从左到右,以便将 iterable 缩减为单个值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算 ((((1+2)+3)+4)+5)。左边的参数 x 是累积值,右边的参数 y 是来自 iterable 的更新值。如果存在可选的 initializer,则在计算中将其放置在 iterable 的项之前,并在 iterable 为空时作为默认值。如果未给出 initializer 并且 iterable 仅包含一个项,则返回第一个项。

此调用接受列表并从左到右比较相邻的两个元素,使用您提供的比较函数。这里,我提供了一个简单的 lamdba,它返回两个中较长的那一个。通过持续地返回任意两个元素中最长的元素,直到遍历整个列表,我返回列表中最长的元素。


2
你可以让它更加紧凑:reduce(lambda x, y: max(x,y, key=len), l) - mousetail

1
list_of_words = ['antman','spiderman','blackwidow','thor']

def longest_word(list_of_words):
    longest_word = ''
    for word in list_of_words:
            if len(word) > len(longest_word):
                    longest_word = word
    return (longest_word)

result = word_list_long(list_of_words)
print(result)

2
你介意在你的代码中添加一些解释吗?看起来 OP 是一个初学者,对于正在发生的事情有一些额外的细节解释会非常有帮助。 - mousetail

0
以下代码将在列表中找到最长的单词并返回,如果有多个最长单词,则返回一个包含它们的列表:
def longest_words(words):
    """Return longest word or list of them if there's a tie."""
    max_indices = []
    max_len = len(words[0])
    for i, length in ((i, len(word)) for i, word in enumerate(words) if len(word) >= max_len):
        if length == max_len:
            max_indices.append(i)
        else:
            max_len = length
            max_indices = [i]

    return words[max_indices[0]] if len(max_indices) < 2 else [words[i] for i in max_indices]


words = ['antman', 'spiderman', 'blackwidow', 'thor', 'submariner']
print(longest_words(words))  # -> ['blackwidow', 'submariner']


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