Как найти самые длинные N слов из списка, используя Python? - PullRequest
0 голосов
/ 09 сентября 2018

Я сейчас изучаю Python и пытаюсь выполнить следующее упражнение:

Предполагая, что в текстовом файле есть список слов, Моя цель - напечатать самых длинных N слов в этом списке.

Там, где есть несколько важных моментов:

  1. Порядок печати не имеет значения
  2. Слова, которые появляются позже в файле, имеют приоритет при выборе (когда есть несколько слов одинаковой длины, я добавил пример для этого)
  3. предположим, что каждая строка в файле содержит только одно слово
  4. Существует ли простое и легкое решение для короткого списка слов, в отличие от более сложного решения для ситуации, когда список содержит несколько тысяч слов?

Я приложил пример начального кода к одному слову с максимальной длиной,

И пример вывода для 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

спасибо заранее!

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Вы можете использовать sorted с пользовательской клавишей tuple, а затем нарезать список.

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
0 голосов
/ 09 сентября 2018

Одной из альтернатив является использование кучи для поддержки элементов top-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))

выход

['Hat', 'House', 'Bicycle', 'Mother']

В куче мы храним элементы, соответствующие длине и положению, поэтому в случае связей выбирается последний из появившихся.

0 голосов
/ 09 сентября 2018

сортировать список слов по длине слова, а затем по переменной счетчика, чтобы слова, встречающиеся позже, имели более высокий приоритет

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