如何使用python从列表中查找最长的N个单词?

如何使用python从列表中查找最长的N个单词?,python,string,list,sorting,top-n,Python,String,List,Sorting,Top N,我现在正在学习Python,并尝试解决以下练习: 假设文本文件中有一个单词列表, 我的目标是打印列表中最长的N个单词 其中有几个要点: 打印顺序无关紧要 当有多个相同长度的单词时,文件中稍后出现的单词将被优先选择,我为此添加了一个示例 假设文件中的每一行只包含一个单词 对于一个简短的单词列表,是否有一个简单易行的解决方案,而对于一个包含数千个单词的列表,是否有一个更复杂的解决方案? 我给一个单词附上了一个起始代码的例子,这个单词的最大长度是 还有一个N=4的输出示例,用于解释我的问题 谢谢你的建

我现在正在学习Python,并尝试解决以下练习:

假设文本文件中有一个单词列表, 我的目标是打印列表中最长的N个单词

其中有几个要点:

打印顺序无关紧要 当有多个相同长度的单词时,文件中稍后出现的单词将被优先选择,我为此添加了一个示例 假设文件中的每一行只包含一个单词 对于一个简短的单词列表,是否有一个简单易行的解决方案,而对于一个包含数千个单词的列表,是否有一个更复杂的解决方案? 我给一个单词附上了一个起始代码的例子,这个单词的最大长度是

还有一个N=4的输出示例,用于解释我的问题

谢谢你的建议

word_list1 = open('WORDS.txt', 'r')

def find_longest_word(word_list):
    longest_word = ''
    for word in word_list:
        if len(word) > len(longest_word):
            longest_word = word
    print(longest_word)

find_longest_word(word_list1)


example(N=4):
WORDS.TXT
---------
Mother
Dad
Cat
Bicycle
House
Hat
结果正如我之前所说,打印订单无关紧要:

Hat
House
Bicycle
Mother

提前谢谢

根据单词的长度,然后根据计数器变量对单词列表进行排序,以便后面出现的单词获得更高的优先级

>>> from itertools import count
>>> cnt = count()
>>> n = 4
>>> sorted(word_list, key=lambda word:(len(word), next(cnt)), reverse=True)[:n]
['Bicycle', 'Mother', 'House', 'Hat']
您可以使用带有自定义元组键的排序,然后使用列表切片

from io import StringIO

x = StringIO("""Mother
Dad
Cat
Bicycle
House
Hat
Brother""")

def find_longest_word(word_list, n):
    idx, words = zip(*sorted(enumerate(word_list), key=lambda x: (-len(x[1]), -x[0]))[:n])
    return words

res = find_longest_word(map(str.strip, x.readlines()), 4)

print(*res, sep='\n')

# Brother
# Bicycle
# Mother
# House

一种替代方法是使用a来维护前n个元素:

import heapq
from operator import itemgetter


def top(lst, n=4):
    heap = [(0, i, '') for i in range(n)]
    heapq.heapify(heap)

    for i, word in enumerate(lst):
        item = (len(word), i, word)
        if item > heap[0]:
            heapq.heapreplace(heap, item)

    return list(map(itemgetter(2), heap))


words = ['Mother', 'Dad', 'Cat', 'Bicycle', 'House', 'Hat']

print(top(words))
输出


在堆中,我们保留与长度和位置相对应的项目,因此在出现领带的情况下,最后出现的项目将被选中

可能是@AndrasDeak的重复嗨,当我写我的问题时,我看到了你正在谈论的问题。这些问题是不同的,因为在你的问题中,它是关于寻找最长和最短的字符串,即返回两个值的最大值和最小值。而在我的问题中,我想打印最长的N个字符串。也就是说,打印N个字符串。这是问题之间的区别,谢谢。非常感谢您的回复!我想知道在你写的代码中我应该在哪里添加print命令?另外,我很乐意理解,你函数的时间和空间复杂度是多少?如果这是一个包含数千个单词的列表,您会使用此解决方案吗?非常感谢您的回复!你能解释一下你函数的时间和空间复杂性吗?如果这是一个包含数千个单词的列表,您会使用此解决方案吗?谢谢应在日志n上,因为它需要排序。要获得更好的时间复杂度,请使用@DanielMesejo的heapq解决方案。谢谢!我现在正在阅读有关heapq函数的内容,为了了解它需要什么样的空间和时间竞争,再次感谢!感谢您的回复和示例!我不熟悉堆函数,你能解释一下你函数的时间和空间复杂度吗?如果这是一个包含数千个单词的列表,您会使用此解决方案吗?谢谢
['Hat', 'House', 'Bicycle', 'Mother']