#python-3.x #sorting #tuples
#python-3.x #сортировка #кортежи
Вопрос:
Начинающий изучающий python здесь. Я перейду прямо к делу. У меня есть список кортежей, каждый из которых содержит имена в определенном порядке. Я хочу отсортировать эти кортежи в алфавитном порядке.
sample_lst = [
('Bessie', 'Buttercup', 'Bella', 'Blue', 'Belinda', 'Beatrice', 'Sue', 'Betsy'),
('Bessie', 'Buttercup', 'Bella', 'Blue', 'Belinda', 'Betsy', 'Beatrice', 'Sue')
('Bessie', 'Belinda', 'Betsy', 'Blue', 'Bella', 'Buttercup', 'Sue', 'Beatrice')
('Bessie', 'Belinda', 'Beatrice', 'Sue', 'Betsy', 'Buttercup', 'Bella', 'Blue')
]
Например, четвертый кортеж в алфавитном порядке будет предшествовать третьему кортежу из-за разницы между Betsy и Beatrice.
Как вы можете видеть, существует небольшой список кортежей, каждый из которых содержит имена (это образец гораздо большего набора кортежей), и мне нужно отсортировать их по алфавиту.
Часть, которая усложняет эту проблему для меня, заключается в том, что нет установленного значения для его сортировки. Если бы я мог просто отсортировать все кортежи по первому индексу, я бы это сделал, но в данном случае логика не применяется. Иногда разница между двумя кортежами равна индексу 4, а в других случаях это может быть 2.
cows = ['Bessie', 'Buttercup', 'Belinda', 'Beatrice', 'Bella', 'Blue', 'Betsy','Sue']
cow_permutations = itertools.permutations(cows, 8)
Надеюсь, этот фрагмент даст вам гораздо более четкое представление о том, что я пытаюсь сделать. Как вы можете, я беру список имен коровы и использую itertools, чтобы найти все возможные перестановки. Мне просто нужно отсортировать их по алфавиту.
Сначала я переосмыслил проблему и попытался использовать лямбда-функции, чтобы каким-то образом отсортировать их в определенном диапазоне, но безрезультатно.
Затем я прибегнул к гораздо более простым методам, таким как .sort()
cow_permutations.sort()
это тоже не удалось, я думал, что смогу отсортировать гигантский список кортежей таким образом. Все, что я получил, это объект ‘itertools.permutations’, не имеющий атрибута ‘sort’ ошибка.
Я думаю, что перепробовал все, что было в моих силах как новичок. Если бы кто-нибудь мог указать мне способ, с помощью которого я мог бы отсортировать список кортежей в алфавитном порядке, или, возможно, предложить другой способ, которым я мог бы найти перестановки всех порядков имен коров, чтобы я мог сделать код менее запутанным — я был бы очень признателен. Заранее спасибо.
Ответ №1:
Здесь вы задаете несколько вопросов, первый из которых заключается в том, как преобразовать cow_permutations из объекта permutations в список кортежей. Вы можете сделать это, приведя список.
cow_permutations_list = list(itertools.permutations(cows, 8))
Самым простым способом сортировки вашего списка будет сортировка по одной комбинированной строке.
cow_permutations_list.sort(key=lambda x:"".join([k.lower() for k in x]))
Если вам нужно выполнить сортировку по определенному диапазону индексов, вы можете ввести его на вход лямбда-функции.
cow_permutations_list.sort(key=lambda x:"".join([k.lower() for k in x[start_index:end_index]]))
Комментарии:
1. Какова цель
"".join()
вkey
? По умолчанию кортежи уже отсортированы в лексикографическом порядке. Объединение строк в ключе на самом деле может привести к сбою в создании лексикографического порядка; например:l = [('aa', 'bb'),('aaa', 'aa')]; print(sorted(l, key=lambda t: ''.join(t))); print(sorted(l))
.2. @Stef верно, но вопрос касается сортировки по алфавиту.
3. Что, в лучшем случае, неоднозначно. Также предполагается, что OP знаком с различием между «лексикографическим» и «алфавитным» и использовал наиболее подходящий. В данном конкретном случае разница несколько незначительна и, безусловно, заслуживает упоминания.
4. @Stef это возможно. Не стесняйтесь добавлять свое собственное решение в качестве ответа.