Программа Python, которая находит самое длинное слово в предложении, используя понимание списка

Предположим, нам предоставили строку.

s = "This is my statement"

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

Я попробовал приведенный ниже код, и он дает мне пустой список.

longest_word=[i for i in s.split() if len(i) == max(s)]

Ищем действительное решение/предложения по этой проблеме.

Можете ли вы предоставить точный результат, который вам нужен из кода.

Prudhviraj 07.10.2023 16:09

Обычный метод был бы max(s.split(), key=len), намного короче и эффективнее, чем использование понимания списка.

mousetail 07.10.2023 16:11

@mousetail max([(len(w), w) for w in s.split()])[1] является эквивалентом, если OP действительно хочет использовать понимание списка, но использование аргумента key для max намного лучше

Sam Mason 07.10.2023 16:23

Или просто max((i for i in s), key=len) чтобы ввести совершенно бесполезное понимание списка

mousetail 07.10.2023 16:25

@mousetail это всего лишь бездействующий генератор, а не понимание, не так ли? Я пытался показать, как использовать возможности языка, т. е. max будет делать что-то похожее на мое, когда ему дадут ключ (но более читабельно и эффективно).

Sam Mason 07.10.2023 16:30

Каким будет результат фразы «Ричард любит бананы»?

DarkKnight 07.10.2023 16:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы выбрал что-то вроде

[k:=w for i,w in enumerate(s.split()) if i==0 or len(w)>len(k)][-1]

Не уверен. Этот вид упражнений, скорее программная версия табу-игры, имеет правила. Возможно, у меня нет прав на использование :=. Возможно, мне было разрешено использовать более одной строки...

По сравнению с вашей попыткой, у нее есть преимущество в том, что вы делаете один проход. Ваш (с поправками Марцина Орловского) — два. Один (неявный) в функции max для поиска самого большого слова. Затем еще один — понимание списка, чтобы выбрать слово, соответствующее этой длине.

С точки зрения производительности это, вероятно, не имеет большого значения (функция max довольно быстрая, поскольку это встроенная функция, вероятно, закодированная на C. Поэтому ее вызов перед довольно медленным for из списка понимания не требует больших затрат) . Но, поскольку это, очевидно, своего рода игра/испытание/упражнение, для того, кто будет судить об этом, может иметь значение то, что алгоритм требует двух проходов, хотя на самом деле нужен только один.

Ответ принят как подходящий

Ошибка в вашем коде — в выражении max(s). При таком использовании max() возвращает символ с наибольшим значением ASCII в строке s, а не длину самого длинного слова, как вы ошибочно предположили. Таким образом, когда вы сравниваете len(i) == max(s), вы сравниваете длину текущего слова i с символом из s, что не имеет особого смысла, поскольку символ (который по существу представляет собой строку длины 1) и длину слова (которое будет больше 1 для любого слова, кроме одного символа) никогда не будет равно, результат сравнения всегда будет равен False, поэтому вы получите пустой список.

Чтобы найти самое длинное слово(а) в строке, s можно создать с помощью аргумента max() a key, куда мы передаем функцию len, которая будет использоваться для сравнения длин, а также понимание списка для обработки нескольких слов одинаковой максимальной длины:

longest_word_length = max(len(word) for word in s.split())
longest_word = [word for word in s.split() if len(word) == longest_word_length]

И после реализации ваш тестовый пример выдаст:

$ python test.py
['statement']

Это сработало! Спасибо за ваше ценное решение.

Varun 07.10.2023 16:14

Другие вопросы по теме