Сортировка кортежей кортежей в алфавитном порядке

У меня есть список кортежей
[((A,B),2),((C,B),3)] Который мне нужно сортировать как

 [((A,B),2),((B,C),3)] 

Мне нужно, чтобы все кортежи были в алфавитном порядке, используя метод sorted() . Я использовал key = lambda x : x[0] но не работает. Есть идеи?

3 Solutions collect form web for “Сортировка кортежей кортежей в алфавитном порядке”

Вы можете использовать sorted в понимании списка :

 In [3]: tups = [(('A','B'),2),(('C','B'),3)] In [4]: [(sorted(t[0]), t[1]) for t in tups] Out[4]: [(['A', 'B'], 2), (['B', 'C'], 3)] 

Поскольку @AmiTarovy решил это, но его метод не включает сортировку по второму элементу внешнего кортежа, когда есть два или более элемента tuple с одним и тем же первым элементом.

Итак, вот еще одно решение, которое также делает сортировку для второго аргумента внешнего кортежа.

 >>> from operator import itemgetter >>> tups = [(('A','B'),2),(('C','B'),3), (('A','B'),1)] >>> sorted(tups, key=itemgetter(0,1)) [(('A', 'B'), 1), (('A', 'B'), 2), (('C', 'B'), 3)] 

Если вы хотите отсортировать только по первому кортежу

 >>> from operator import itemgetter >>> tups = [(('A','B'),2),(('C','B'),3), (('A','B'),1)] >>> sorted(tups, key=itemgetter(0)) [(('A', 'B'), 2), (('A', 'B'), 1), (('C', 'B'), 3)] 

ОБНОВИТЬ

Потребление времени. Входные данные – 100 записей

 ((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100)) 

Результаты :

@AmiTarovy отвечает с сортировкой только первым элементом кортежа

 python3 -m timeit -s "import random; import string; tups = [((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100)) for i in range(100)]" 'from operator import itemgetter; [(sorted(t[0]), t[1]) for t in tups]' 10000 loops, best of 3: 42.7 usec per loop 10000 loops, best of 3: 43.2 usec per loop 10000 loops, best of 3: 43.9 usec per loop 

Мой ответ с сортировкой только по первому элементу кортежа

 python3 -m timeit -s "import random; import string; tups = [((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100)) for i in range(100)]" 'from operator import itemgetter; sorted(tups, key=itemgetter(0))' 10000 loops, best of 3: 36.1 usec per loop 10000 loops, best of 3: 36.6 usec per loop 10000 loops, best of 3: 37.9 usec per loop 

Мой ответ со всей сортировкой , но первый элемент в приоритете

 python3 -m timeit -s "import random; import string; tups = [((random.choice(string.ascii_uppercase), random.choice(string.ascii_uppercase)), random.randint(0,100)) for i in range(100)]" 'from operator import itemgetter; sorted(tups, key=itemgetter(0,1))' 10000 loops, best of 3: 61 usec per loop 10000 loops, best of 3: 60.2 usec per loop 10000 loops, best of 3: 60.6 usec per loop 
 l = [(('A','B'),2),(('C','B'),3)] f=[(tuple(sorted(x[0])),x[1]) for x in l] 

Вывод :

 [(('A', 'B'), 2), (('B', 'C'), 3)] 
  • Правильное использование sqlalchemy scoped_session с python asyncio
  • Самый эффективный способ удалить первые N элементов в списке Python?
  • Python3 - reload () нельзя вызвать в объекте __import__?
  • выяснить, работает ли скрипт python в режиме ожидания или командной строки терминала / командной строки
  • Утечка памяти при отбрасывании изображения в Python
  • Руководство по использованию Concurrent.futures - простой пример использования потоков и обработки
  • Строковое выражение Python 2 не распознается с помощью Python 3
  • маскировка встроенной переменной с ее магическим поведением?
  • Python - лучший язык программирования в мире.