Лямбда-выражения и строки - PullRequest
0 голосов
/ 02 июля 2019

Я только что узнал о лямбда-выражениях, и мне интересно, как я мог бы использовать его для подсчета количества гласных в строке. Например, Я использую следующее:

result = lambda i, y: i + 1 for x in y if x in "aeoiuAEIOU"
print(result(0,s)

Однако я получаю синтаксическую ошибку. Также, чтобы прояснить мое понимание, лямбда-выражение возвращает выражение после двоеточия. Может ли кто-нибудь указать мне правильное направление?

Ответы [ 4 ]

2 голосов
/ 02 июля 2019

Это просто разбор, который неоднозначен.Рассмотрим

result = lambda i, y: (i + 1 for x in y if x in "aeoiuAEIOU")

Конечно, теперь он вернет объект генератора, который будет печататься не так хорошо.Если вы хотите список, вы можете попробовать

result = lambda i, y: [i + 1 for x in y if x in "aeoiuAEIOU"]
1 голос
/ 02 июля 2019

Вы также можете просто использовать один параметр в lambda:

result = lambda y: sum(x in "aeoiuAEIOU" for x in y)

, и синтаксическая ошибка не является особенной для lambda:

In [10]: def bar(i, y):
    ...:     return i + 1 for x in y if x in "aeoiuAEIOU"
  File "<ipython-input-10-96fcd0959145>", line 2
    return i + 1 for x in y if x in "aeoiuAEIOU"
                   ^
SyntaxError: invalid syntax

, реальная проблема заключается в том, чтоi + 1 for x in y if x in "aeoiuAEIOU" - недопустимое выражение в Python.

1 голос
/ 02 июля 2019

Спасибо Сильвио за помощь! Заполнение списка, как вы предложили, дало мне ответ, который был не так ясен, как я хотел, так как он вернулся

[1, 1, 1, 1, 1]

Пока генератор вернулся

<generator object <lambda>.<locals>.<genexpr> at 0x0000028884166C00>

В итоге я использовал сумму на генераторе, чтобы получить

result = lambda i, y: sum(i + 1 for x in y if x in "aeoiuAEIOU")
print(result(0, s))

Который дал мне ответ 5.

1 голос
/ 02 июля 2019

Для меня это неправильное использование lambda для начала, так как lambda должны быть определениями функций без имени или более или менее одноразовой функцией. Кроме того, причина, по которой вы получили синтаксическую ошибку, заключается в том, что ваше выражение генератора неверно, используйте sum для чего-то подобного.

result = lambda y: sum(1 for x in y if x in "aeoiuAEIOU")

Вы даже можете использовать карту для этого:

result = lambda y: sum(map(y.count, "aeoiuAEIOU"))

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

#more appropriately named count_vowels vs result and s vs y
def count_vowels(s):
    _s = s.lower()
    return sum(map(_s.count, 'aeiou')

Вы также можете использовать re (регулярное выражение) для этого тоже:

import re

def count_vowels(s): return len(re.findall("[aeiou]", s, re.I))

re.I игнорирует регистр, поэтому не нужно беспокоиться о capsvs uncaps

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...