Я пытаюсь найти длину всех слов в строке и вернуть список с каждым словом и его длиной рядом с ним. Вот пример:
Строка «привет, питон» вернет [«привет 5», «питон 6»]
Я написал это до сих пор:
ele1 = str_[0]
lettlist = list(map(len, str_.split()))
return (str(lettlist))
И он возвращает только числа, например, «[5, 5]» для «привет, мир». Как мне заставить его возвращать как строку, так и числа в списке, как в моем примере выше?
Вы можете использовать понимание списка для создания списка и форматирование строк для создания значений.
Поскольку вам нужно слово в результате, вы можете создать fstring со словом, вычислить длину слова и добавить значение в ту же строку. Python отформатирует строку результата в желаемый результат и переберет список, который возвращает phrase.split(). Когда каждое значение вычислено, создается окончательный список.
def word_lengths(phrase):
return [f"{word} {len(word)}" for word in phrase.split()]
print(word_lengths("How long are the words in this phrase"))
# ['How 3', 'long 4', 'are 3', 'the 3', 'words 5', 'in 2', 'this 4', 'phrase 6']
Map — не очень практичный инструмент, когда вы хотите делать подобные манипуляции. Часто проще использовать понимание списка, потому что синтаксис легче получить, адаптировать и исправить, если он не делает то, что вы хотите.
Используя функцию map, вот код:
def word_lengths(phrase):
return list(map(lambda word: f"{word} {len(word)}", phrase.split()))
Как видите, это менее «английский», чем понимание списка, и требуется приведение к списку.
Неплохой ответ, но я действительно не понимаю, почему «понимание списка» было бы лучше (или проще для понимания), чем вызов map(). Оба являются краткими способами написания «для каждого цикла» (просто «цикла for» на языке Python) для коллекции, выполнения каких-либо действий с каждым элементом и возврата другой коллекции. Один способ встроен в язык, а другой использует отдельную функцию (но это также часть основной спецификации Python). Для программистов старой школы классический цикл может показаться даже «более английским». В конце концов, я думаю, это просто вопрос предпочтений.
Потому что это более питонично. Конвенция рекомендует использовать понимание списка в этом случае, потому что его, как правило, легче объяснить новичку, и программист старой школы также не будет испытывать затруднений, где map может быть трудно понять людям, не привыкшим к концепции функции. первый объект класса.
Это? Python имеет 70 основных функций, включая такие конструкторы, как int(). Небольшой счет по сегодняшним меркам; и map() является одной из этих функций. Это также современный, возвращающий итератор и дающий результаты. Функции как FCO могут быть сложной концепцией для Java-программистов, но не для других. Я на 100% придерживаюсь философии языка (поэтому мне не нравятся TypeScript или Rust). Но программисты должны использовать доступные инструменты творчески (и разумно), а не просто повторять формулы. Лорен использовала map() и пыталась понять, что с ней не так.
Вот почему я показал решение с картой. Кроме того, поскольку ОП борется с картой и тем, как ее использовать, я предложил более простой инструмент. И по опыту понимание списка легче понять, чем карту. Вот и все, и если вам не нравится мой совет ОП, ок, заметил. Хорошего дня.
Сохраняя большую часть своего кода (и избегая создания именованной функции), вы можете просто сделать:
str_ = "hello world"
lettlist = list(map(lambda s : s + " " + str(len(s)), str_.split()))
return str(lettlist)
Обратите внимание, что я только что заменил функцию (или ссылку на функцию), предоставленную в качестве первого параметра, на map().
len
Заменяется на:
lambda s : s + " " + str(len(s))
«И он возвращает только числа, например, «[5, 5]» для «привет, мир». - ну да, потому что функция len, которая mapped, возвращает только эти значения. Можете ли вы написать функцию, которая дает желаемый результат для одной строки? Что произойдет, если вы попробуете mapпинговать эту функцию вместо len? В какой части вы на самом деле застряли?