LINUX.ORG.RU

А вот у меня такой вопрос по сравнению строк


0

1

Например, если у нас есть два числа 5 и 7, и я их сравниваю с помощью операции < (операция «зашита» и не меняется), я получу true. Чтобы получить false, мне достаточно сравнить тем же оператором те же числа в том же порядке, но со знаком минус. Есть ли что-то аналогичное для строк? Т.е. какую операцию надо произвести над двумя строками, чтобы при сравнении тем же оператором, в том же порядке получить противоположный результат? Навеяно необходимостью сортировать данные для таблицы по двум колонкам в различных направлениях в python. По имени asc, по дате desc.

            array = sorted([(v.get('stringField'), int(k)) for k, v in someMap.items()], key=lambda x: (x[1], x[0]), reverse=(sortDir == 'desc'))
вот такая штука мне нужна. Как отсортировать по int(k) desc, а при равных int(k) чтобы оно сравнивало v.get('stringField'), но asc? Пока писал, в голову пришел хак вроде
            array = sorted([(v.get('stringField'), int(k)) for k, v in someMap.items()], key=lambda x: (-x[1], x[0]), reverse=(sortDir == 'asc'))
, но оригинальный вопрос про строки остается. Просто ради интереса.

Апд1: Разумеется, в одну строку нужно. Никаких явных циклов и прочего.

★★★☆

Последнее исправление: JFreeM (всего исправлений: 1)

> Т.е. какую операцию надо произвести над двумя строками, чтобы при сравнении тем же оператором, в том же порядке получить противоположный результат?
a, b = b, a # :)

urxvt ★★★★★
()
In [1]: "string1" < "string2"
Out[1]: True

In [2]: "string2" < "string1"
Out[2]: False

In [3]: str.__lt__("string1", "string2")
Out[3]: True

In [4]: str.__lt__("string2", "string1")
Out[4]: False
power
()
Ответ на: комментарий от power

>тем же оператором, в том же порядке

JFreeM ★★★☆
() автор топика

Общее решение:

class CmpInvertor(object):
    def __init__(self, value):
        self.value = value

    def __lt__(self, obj):
        return self.value > obj.value

data = [(1, 'aa'), (1, 'bb'), (2, 'aa'), (2, 'bb')]

print sorted(data, key=lambda (a,b):(a, CmpInvertor(b)))
baverman ★★★
()
Ответ на: комментарий от baverman

ага, спасибо большое. Интересный хак.

JFreeM ★★★☆
() автор топика
Ответ на: комментарий от baverman

Нет, ТС нужно, чтоб в одну строку было. Примерно так:

print sorted(data, key=lambda (a, b), CmpInvertor=type('', (object,), {'__init__': (lambda self, value: vars(self).__setitem__('value', value)), '__lt__': lambda self, obj: self.value > obj.value}): (a, CmpInvertor(b)))
:-)

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.