Как отсортировать список с помощью компаратора?

Рейтинг: 1Ответов: 2Опубликовано: 11.01.2023

Как отсортировать список python3 с помощью компаратора, который сравнивает два элемента? Я знаю, что в python в функции sort есть ключевой аргумент key, но он получает лишь один элемент, а мне нужно сравнить два. Я пробовал использовать функцию cmp_to_key, но она не работает.

код, который я пытался заставить работать:

import functools


a = []


def f(g, h):
    p = 1.0
    k = 1.0
    i = 9
 
    while i + 1:
        k = a[h][i]**k / a[g][i]
        if p > 99 and abs(k - 1) > 0.02:
            break
        k = 1 if abs(k - 1) < 1e-10 else k**p
        
        if not 0.11 < k < 9:
            break
        
        p = a[g][i]**p
        i -= 1
 
    print(g, h, k > 1)
    return k > 1


g = []
h = []
n = int(input())

for i in range(n):
    g.append(i);
    h.append(0);
    *l, = map(int, input().split())
    k = l[0]
    k += 1
    u = True;

    a.append([])
    for o in l[1:]:
        u = 0 if o < 2 else u
        a[i].append(o if u else 1)

    for _ in " " * (10 - k):
        a[i].append(1)

# s(0, n - 1)
print(*map(lambda x: x + 1, sorted(g, key=functools.cmp_to_key(f))))

Ввод:

10
4 2 2 2 2 2
1 2 2
1 3 2
1 2 3
3 2 2 2 2
2 2 2 2
1 3 3
3 3 3 3 3
2 4 3 3
2 2 3 4

Начальный массив для сортировки:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Каким должен быть вывод:

2 4 3 6 7 5 9 10 1 8

Какой вывод я получаю:

1 2 3 4 5 6 7 8 9 10

Ответы

▲ 2Принят

Компаратор переданный в cmp_to_key должен возвращать численное значение.

В вопросе функция возвращает boolean.

Так как k сравнивается с единицей равносильным переходом к числу будет

k-1
1-k

В зависимости от направления сортировки.

▲ 4

Для этого можно воспользоваться функцией cmp_to_key из модуля functools:

from functools import cmp_to_key

def comparator(x, y):
    return x - y

a = [7, 3, 6, 10, 5, 2, 1]

print(sorted(a, key=cmp_to_key(comparator))) 

Вывод:

[1, 2, 3, 5, 6, 7, 10]