Возможно ли, чтобы список кортежей, содержащих несколько строк, был отсортирован в алфавитном порядке по неизвестному индексу? Питон

#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 это возможно. Не стесняйтесь добавлять свое собственное решение в качестве ответа.