Сортировка по питону и пустым строкам - PullRequest
4 голосов
/ 22 февраля 2012

Привет! Я использую функцию sorted () в Python, чтобы упорядочить двумерный массив (я хочу отсортировать столбцы так же, как это можно сделать в классической электронной таблице).

В приведенном ниже примереЯ использую itemgetter (0), чтобы отсортировать сетку на основе содержимого первого столбца.

Но отсортированный возвращает пустые строки перед непустыми.:

[['alice', 'female', 'rome'], ['bob', 'male', 'paris'], ['charly', 'male', 'london'], ['', 'unknown', 'somewhere']]

Есть ли простой способ сделать это?

Ответы [ 4 ]

19 голосов
/ 22 февраля 2012

Используйте другую функцию клавиш.Вот что будет работать:

sorted(res, key=lambda x: (x[0] == "", x[0].lower()))

Ключ - это кортеж с 0 (False) или 1 (True) в первой позиции, где True указывает, что первый элемент в записи пуст.Вторая позиция имеет поле имени из вашей исходной записи.Затем Python будет сортировать сначала по группам непустых и пустых имен, а затем по имени в пределах непустого имени группы.(Python также будет сортировать по имени в пустой группе имен, но поскольку имя пустое, он ничего не будет делать.)

Я также позволил себе сделать сортировку имен без учета регистра, преобразовав их все встрочные буквы в ключе.

Простая замена пустых имен на "ZZZZZZ" или что-то "в алфавитном порядке" заманчива, но не дает результатов в первый раз, когда какой-то джокер вводит свое имя как "ZZZZZZZZ" для теста.Я думаю, что-то вроде '\xff' * 100 может сработать, но все равно похоже на взлом (также, потенциальные подводные камни Unicode).

1 голос
/ 22 февраля 2012

Вы можете передать ключевую функцию, возвращающую фактическое значение или 100 'z, если первый элемент пуст (пустые строки оцениваются как False.

sorted(res, key= lambda x: x[0] if x[0] else 'z'*100 )
0 голосов
/ 22 февраля 2012

Это работает, будь немного многословно:

def cmp_str_emptylast(s1, s2):
    if not s1 or not s2:
        return bool(s2) - bool(s1)

    return cmp(s1, s2)

sorted(res, key=operator.itemgetter(0), cmp=cmp_str_emptylast)
0 голосов
/ 22 февраля 2012
key=lambda x: x[0] if x[0] else '\xff\xff\xff\xff\xff\xff\xff\xff\xff'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...