#python #hadoop #mapreduce
Вопрос:
Я пытаюсь использовать принципы MapReduce с Python, чтобы сначала отобразить отдельный список слов из текста с их количеством символов, а затем уменьшить, чтобы отобразить самые длинные слова и их количество символов.
Смотрите визуальное объяснение Ввод простой text.txt файл с 3 предложениями. Смотрите ниже мой картограф:
#MAPPER #!/usr/bin/python import sys for line in sys.stdin: for word in line.strip().split(): print(str(len(word)) 't' word)
Спасибо, что помогли с редуктором. Требуемый результат: «Самые длинные слова в этом тексте-xxxxxxxxx и ггггггг с xx символами».
Комментарии:
1. Было бы здорово предоставить пример ввода и ожидаемый результат (с этой целью лучше изменить свой код, чтобы использовать список строк здесь в качестве входных данных, а не
sys.stdin
)2. Вы , конечно, можете создать список кортежей
(len(word), word)
, затем отсортировать их в порядке убывания и распечатать несколько лучших. Это то, что тебе нужно?3. @Tim если вы работаете со сколь угодно длинным вводом, лучше вычислять минимальное/максимальное значение по ходу (т. Е. проверьте для каждой итерации, является ли значение ниже/выше, и замените). Это более эффективно для памяти, чем сбор всего, и более эффективно для вычислений, чем сортировка всего. 😉
4. @mozway Я отредактировал с требуемым результатом спасибо!
5. @TimRoberts, как объясняет Мозуэй, я думаю, что здесь лучше использовать» макс ()», » лен ()».
Ответ №1:
Это делает то, о чем вы просите. При этом сохраняются только 5 лучших слов, что значительно облегчает сортировку. «Печать» в цикле предназначена только для отладки и может быть удалена.
import sys top5 = [] for line in sys.stdin: for word in line.strip().split(): top5.append( (len(word),word) ) top5.sort( reverse=True ) top5 = top5[:5] print(top5) print( "Top 5 words by length are:" ) print(top5)