list1 : ['beg', 'begs', 'big', 'bug', 'buggies', 'bugs', 'bus', 'egg', 'eggs', 'gig', 'sub', 'sue', 'use'] BUGGIES
У меня есть список слов, но я хочу поместить самое длинное слово «багги» в конец списка, но сохранить порядок в алфавитном порядке, за исключением самого длинного слова. Может быть случай, когда более одного слова соответствуют максимальному значению (len), в этом случае было бы неплохо иметь эти слова в конце. но я надеюсь просто найти первого.
В настоящее время я нахожу это слово и помещаю его за пределы списка, как показано, но в идеале мне бы хотелось, чтобы оно отображалось так:
list1 : ['beg', 'begs', 'big', 'bug', 'bugs', 'bus', 'egg', 'eggs', 'gig', 'sub', 'sue', 'use', 'buggies']
Любая помощь по этому поводу будет оценена по достоинству, я только начинаю изучать Python.
То, что я пробовал, ну, ничего по этому поводу, но это то, что у меня сейчас есть:
sortedwords = sorted(list, key=len)
possible_words = sorted(list)
print('list1:', possible_words, max(possible_words, key=len).upper())
Вы можете добиться этого, сначала найдя самое длинное слово (слова) в списке, а затем отсортировав список, гарантируя, что самое длинное слово (слова) будет помещено в конец:
list1 = ['beg', 'begs', 'big', 'bug', 'buggies', 'bugs', 'bus', 'egg', 'eggs', 'gig', 'sub', 'sue', 'use']
#This is will find the length of the longest word in the list
max_len = max(len(word) for word in list1)
# separate the longest word from other words to sort the list
longest_words = [word for word in list1 if len(word) == max_len]
other_words = [word for word in list1 if len(word) != max_len]
# sort the list contains otherwords
sorted_other_words = sorted(other_words)
# finally combine both lists to get the resultant list
result_list = sorted_other_words + longest_words
print(result_list)
Выход:
['beg', 'begs', 'big', 'bug', 'bugs', 'bus', 'egg', 'eggs', 'gig', 'sub', 'sue', 'use', 'buggies']
Это хорошая проблема для использования цикла for:
max_word_len = 0
longest_word_index = -1
for i in range(len(list1)):
if len(list1[i]) > max_word_len:
max_word_len = len(list1[i])
longest_word_index = i
temp_long_word = list1[index]
del list1[longest_word_index]
list1.push(temp_long_word)
Конечно, этот пример можно немного сократить, но поскольку вы упомянули, что только начинаете, я привел это для того, чтобы вы могли наглядно понять, что происходит.
братан, твое решение не работает более чем для одного слова в списке. Вам необходимо поддерживать список всех индексов max_len в списке. и, наконец, удалите их все из списка и добавьте в конец
Они сказали, что надеются найти первого найденного. Если им нужно больше, для этого достаточно просто расширить код.
Несмотря на то, что оно не работает для полного решения, оно написано совершенно непитонично. Прежде всего, -1
в индексировании Python имеет смысл, поэтому вы не можете просто считать этот индекс несуществующим, он относится к последнему элементу. Во-вторых, у вас уже есть функция max()
, почему бы не использовать ее, чтобы сделать код более понятным, читабельным и простым в поддержке? (@Ответ Матиаса содержит хороший пример использования). Хорошо, предположим, что вам нужно больше логики в цикле, и вам нужен сам элемент и индекс -> тогда используйте enumerate()
.
Оглядываясь назад, возможно, это могло бы быть немного более питоническим, спасибо за этот комментарий.
Определите длину самого длинного слова. Затем используйте функцию сортировки, которая проверяет, имеет ли текущее слово максимальную длину или нет.
list1 = ["one", "two", "three", "four", "five", "six", "seven"]
maxlen = len(max(list1, key=len))
list1.sort(key=lambda s: (len(s) == maxlen, s))
Результат ['five', 'four', 'one', 'six', 'two', 'seven', 'three']
. «семь» и «три» — самые длинные слова и располагаются в конце списка.
Ключевая функция возвращает кортеж, в котором первое значение равно 1, если длина равна максимальной длине, и 0 в противном случае. Следовательно, это первый критерий сортировки. Второе значение — это сама строка, поэтому слова сортируются в алфавитном порядке в соответствующих группах.
Мужчины (и дамы тоже) Я новичок в этом, и я ценю все ответы, но больше всего мне откликается Л. Тайрон, он хорошо прокомментирован, за ним легко следить, и теперь я выучил несколько вещей, например, слова. удалить и слова.добавить. Не говорю, что другие ответы плохи, но этот на моем уровне, и я могу понять. Спасибо всем за ваш вклад.
Менее эффективное, но потенциально более простое для понимания решение:
# Find the longest word
longest_word = max(words, key=len)
# Remove the longest word from the list
words.remove(longest_word)
# Sort the remaining words alphabetically
sorted_words = sorted(words)
# Append the longest word to the end
sorted_words.append(longest_word)
# Print the result
print('list1:', sorted_words)
В результате получается ['просить', 'просить', 'большой', 'ошибка', 'ошибки', 'автобус', 'яйцо', 'яйца', 'концерт', 'суб', 'судить', 'использовать ', 'багги'] для списка, который вы изначально предоставили
Функция .max()
(по умолчанию) находит первое самое длинное слово, а не все самые длинные слова. Кроме того, .remove()
(по умолчанию) удаляет только первое вхождение слова. Поскольку автор намеревается расширить решение для обработки нескольких слов, ваше решение нелегко расширить и оно может скорее вводить в заблуждение, чем помогать.
Найдите максимальную длину, а затем отсортируйте ее по тому, имеют ли слова такую длину.
m = max(map(len, list1))
list1.sort(key=lambda s: len(s) == m)
Отсортируйте список по алфавиту. Найдите самое длинное слово в списке. Удалите его, а затем добавьте обратно в список в конце. В чем сложность?