python сортировка двумерного массива
Здравствуйте столкнулся с таким интересным вопросом. Как отсортировать такой массив по количеству гласных я сделал так
['My', 'name', 'is', 'Ivan']
res = sorted(arr, key=lambda word: sum(ch in "AOYUEIaoyuei" for ch in word), reverse=False)
print(res)
Ответ: ['My', 'is', 'name', 'Ivan']
А вот как отсортировать массив предложений по количеству гласных? Вот такой массив например:
[['Ok, anything else?'], ['Aaaa'], ['My name is Nik']]
Чтобы результат был таким:
[['Aaaa'], ['My name is Nik'], ['Ok, anything else?']]
Я так понимаю, что принцип тот же. Сначала разбить внутренние массивы на двумерные, а потом проводить сортировку, но как это реализовать... Я сделал свой собственный алгоритм сортировки, но опять же это для такого варианта:
arr = ['My', 'name', 'is', 'Ivan']
for words in range(len(arr)):
count = 0
for letters in range(len(arr[words])):
if arr[words][letters] in list_vowels:
count += 1
arr[words].append(count)
arr.sort(key=lambda words: words[-1])
print(arr)
Буду очень благодарен за любые идеи :)
Ответы (2 шт):
# Вспомогательная функция для подсчёта гласных в одной строке
count_vowels_in_word = lambda word: sum(char in "AOYUEIaoyuei" for char in word)
# Вспомогательная функция для подсчёта гласных в списке строк
count_vowels_in_sequence = lambda seq: sum(map(count_vowels_in_word, seq))
src = [['Ok, anything else?'], ['Aaaa'], ['My name is Nik']]
print(sorted(
src, # Что сортируем
key=count_vowels_in_sequence # По чему сортируем
))
Для поиска гласных нет разницы предложение или слово. И первое, и второе, просто набор символов, только в предложении присутствуют пробелы и знаки пунктуации, что на количество гласных не влияет. Так что подход в обоих случаях одинаковый.
# Убрал лишние скобки вокруг строк, зачем они нужны?
sentences = [
'Ok, anything else?',
'Aaaa',
'My name is Nik'
]
# Преобразуем в 'set' для быстрого поиска
vowels = set("aeiouy")
print(sorted(sentences, key=lambda sentence: sum(1 for char in sentence if char.lower() in vowels)))
Output
['Aaaa', 'My name is Nik', 'Ok, anything else?']