Сортировка по нескольким правилам - PullRequest
0 голосов
/ 01 июня 2019

Словарь, ключи которого представляют собой три отдельных символа, а ключи представляют собой списки разного размера, используйте функцию сортировки / сортировки, чтобы отсортировать этот словарь по длине массива значений.Если длина массива значений равна, отсортируйте его по 3-му элементу (символу) в ключе.Если в этом случае также возникает коллизия, отсортируйте ее по 2-му элементу в порядке возрастания.Размер символа (верхний / нижний) не имеет значения.

Мне удалось отсортировать его по длине значений, но я не могу найти решение, как найти столкновение и использовать два других правила сортировки.

x = {("a", "B", "b"):[2, 0], ("A", "c", "b"):[2,1], ("d", "a", "C"):[0, 0, 0], 
     ("A", "A", "A"):[2], ("e", "e", "t"):[2, 3]}

sort1 = sorted(x.items(), key = lambda x: x[1].__len__())

input = {("a", "B", "b"):[2, 0], ("A", "c", "b"):[2,1], ("d", "a", "C"):[0, 0, 0], 
         ("A", "A", "A"):[2], ("e", "e", "t"):[2, 3]}

expected_output = [(("A", "A", "A"):[2]),(("e", "e", "t"):[2, 3]),
                   (("A", "B", "b"):[2, 1]),(("a", "c", "b"):[2, 0]),
                   (("d", "a", "C"),[0, 0, 0])]

1 Ответ

0 голосов
/ 01 июня 2019

Можно использовать tuple для аргумента key.
Здесь я использую функцию ord для сортировки символов в нисходящем режиме.

x = {("a", "B", "b"):[2, 0], ("A", "c", "b"):[2,1], ("d", "a", "C"):[0, 0, 0], ("A", "A", "A"):[2], ("e", "e", "t"):[2, 3]}

sorted(x.items(), key=lambda x: (len(x[1]), -ord(x[0][2].lower()), x[0][1].lower()))

[(('A', 'A', 'A'), [2]),
 (('e', 'e', 't'), [2, 3]),
 (('a', 'B', 'b'), [2, 0]),
 (('A', 'c', 'b'), [2, 1]),
 (('d', 'a', 'C'), [0, 0, 0])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...