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

У меня есть список кортежей
[((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)] 
  • filedialog, tkinter и открывающие файлы
  • Преобразование бит в байты в Python
  • Как добавить тайм-аут соединения с помощью asyncio?
  • Py2exe для Python 3.0
  • Python 3 - Как правильно настроить это многопроцессорное задание?
  • Класс с изменением __hash__ по-прежнему работает со словарным доступом
  • Программный импорт модуля через importlib - __path__ не установлен?
  • Выключение и повторная привязка сокета - Как избежать долгого ожидания?
  • Python 3.4 вызывает UnicodeEncodeError на сервере Apache2 (Mac), но отлично работает в командной строке
  • Почему такое понимание списков происходит быстрее?
  • Как заставить SublimeText поддерживать аннотации Python 3?
  • Python - лучший язык программирования в мире.