Как я могу заставить эту функцию Python возвращать строку вместо списка, содержащего одну строку?

#python #string

#python #строка

Вопрос:

Как я могу заставить эту функцию Python возвращать строку вместо списка, содержащего одну строку?

 def num_vowels(s):
    """ returns the number of vowels in the string s
        input: s is a string of 0 or more lowercase letters
    """
    if s == '':
        return 0
    else:
        num_in_rest = num_vowels(s[1:])
        if s[0] in 'aeiou':
            return 1   num_in_rest
        else:
            return 0   num_in_rest

#most vowels returns a list not a string
def most_vowels(wordlist):
    '''Takes a list of strings called wordlist and returns the string in
       the list with the most vowels.'''
    list_of_num_vowels = [num_vowels(x) for x in wordlist]
    max_val =  max(list_of_num_vowels)
    return [x for x in wordlist if num_vowels(x) == max_val] 
  

Некоторые тестовые примеры:

 most_vowels(['vowels', 'are', 'amazing', 'things'])
  

вывод: 'amazing'

 most_vowels(['obama', 'bush', 'clinton'])
  

вывод: 'obama'

Спасибо!

Комментарии:

1. пожалуйста, используйте форматирование кода, делая отступ в строке на четыре пробела для лучшей читаемости

2. Спасибо, кто отредактировал форматирование, я все еще пытаюсь разобраться.

3. Работают ли приведенные примеры?

4. return list_with_one_element[0]

5. В моей функции они выводят [‘amazing’] и [‘obama’], когда они должны выводить, как это показано (‘amazing’ и ‘obama’).

Ответ №1:

ваша most_vowels() функция использует понимание списка для фильтрации совпадающих значений и возврата нового списка. Вы можете вывести строку напрямую двумя способами.

Первый способ — проиндексировать первый результат из результата понимания.

 return [x for x in wordlist if num_vowels(x) == max_val][0]
  

Другой вариант, если вы считаете, что можете получить несколько результатов, но все еще хотите строку, — это объединить любые результаты с запятой (или другим разделителем) в строку.

 return ','.join([x for x in wordlist if num_vowels(x) == max_val])
  

Это преобразуется ['first', 'second'] в 'first,second' .

Комментарии:

1. Именно то, что я хотел! Спасибо. 🙂

2. Я поддержал и пометил как правильный. Почему мой пост был так сильно отклонен? Пытаюсь научиться пользоваться сайтом извините, мое форматирование не было отличным .. люди — придурки.

3. Не расстраивайтесь. Скорее всего, это было сочетание форматирования и того факта, что ответом является очень простое индексирование списка python. Люди не придурки, они просто не считают, что это ценный вопрос.

Ответ №2:

Ваша most_vowels функция как бы заново изобретает колесо. Python уже предоставил вам гораздо более простое средство для этого — использовать max с необязательным key аргументом и просто выбирать слово с наибольшим количеством гласных:

 def most_vowels(wordlist):
    return max(wordlist, key=num_vowels)
  

Ответ №3:

Вы можете получить ответ прямо из max , сравнив количество гласных вместо обычного порядка для строк, передав num_vowels как key :

 def most_vowels(wordlist):
    return max(worldlist, key=num_vowels)
  

В качестве альтернативы, способ, которым вы нашли наибольшее количество гласных, max_val который вы могли бы использовать next с фильтром понимания:

     return next(word for word in wordlist
                if num_vowels(word) == max_val)