Предположим, нам предоставили строку.
s = "This is my statement"
Нам нужно получить предложение в качестве вывода, и эту проблему необходимо решить, используя концепцию понимания списка.
Я попробовал приведенный ниже код, и он дает мне пустой список.
longest_word=[i for i in s.split() if len(i) == max(s)]
Ищем действительное решение/предложения по этой проблеме.
Обычный метод был бы max(s.split(), key=len), намного короче и эффективнее, чем использование понимания списка.
@mousetail max([(len(w), w) for w in s.split()])[1] является эквивалентом, если OP действительно хочет использовать понимание списка, но использование аргумента key для max намного лучше
Или просто max((i for i in s), key=len) чтобы ввести совершенно бесполезное понимание списка
@mousetail это всего лишь бездействующий генератор, а не понимание, не так ли? Я пытался показать, как использовать возможности языка, т. е. max будет делать что-то похожее на мое, когда ему дадут ключ (но более читабельно и эффективно).
Каким будет результат фразы «Ричард любит бананы»?






Я бы выбрал что-то вроде
[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']
Это сработало! Спасибо за ваше ценное решение.
Можете ли вы предоставить точный результат, который вам нужен из кода.