Можно ли выполнить условную сортировку по двум различным столбцам, но где порядок двух столбцов меняется на обратный в зависимости от вторичного условия?

1

Edit: С момента написания этого, я вспомнил третье необходимое условие. То есть, если разница между значениями в индексе 1 (время) больше или равна 2, то строки должны сортироваться обычно столбцом индекса 1 (время). Так как значение времени для B равно 6 и в пределах разницы 2 для T времени 5, B должно прибыть после T. Однако, например, для T и K, поскольку значение 7 для K равно 2 больше, чем 5 значение для T, T должно быть первым.

Скажем, у меня есть этот массив

input = [['user_id', 'time', 'address'], 
    ['F', 5, 5], 
    ['T', 5, 8],
    ['B', 6, 6], 
    ['K', 7, 7], 
    ['J', 7, 9], 
    ['M', 9, 10]]

Я хотел бы отсортировать строки - сначала в порядке возрастания по индексу 1 (время). Однако, во-вторых, если индекс 2 (адрес) для данного user_id, такого как "B", меньше, чем индекс 2 (адрес) для другого пользователя, такого как "T", я бы хотел, чтобы user_id "B" появился перед user_id 'T ".

Таким образом, конечный результат будет выглядеть так:

output = [['user_id', 'time', 'address'], 
        ['F', 5, 5],
        ['B', 6, 6]
        ['T', 5, 8],
        ['K', 7, 7], 
        ['J', 7, 9], 
        ['M', 9, 10]]

Если возможно, я бы хотел сделать это без Панд.

Теги:
list
sorting

2 ответа

2
Лучший ответ
>>> import functools
>>> 
>>> def compare(item1, item2):
...     return item1[1]-item2[1] if item1[1]-item2[1] >=2 else item1[2]-item2[2]
... 
>>> 
>>> output = [input[0]] + sorted(input[1:], key = functools.cmp_to_key(compare))
>>> pprint (output)
[['user_id', 'time', 'address'],
 ['F', 5, 5],
 ['B', 6, 6],
 ['T', 5, 8],
 ['K', 7, 7],
 ['J', 7, 9],
 ['M', 9, 10]]
>>> 
  • 0
    Привет @sunitha. Я забыл включить третье, важное условие, которое показывает, почему K не должен предшествовать T, даже если B должен предшествовать T. То есть, если разница между значениями в индексе 1 (время) больше или равна 2, затем строки должны быть отсортированы по столбцу индекса 1 (время). Таким образом, для T и K, поскольку значение 7 для K на 2 больше, чем значение 5 для T, T должно стоять первым. Но для B и T B предшествует T, потому что 6 только на 1 больше 7, поэтому разница во времени между B и T не превышает 2. Изменит ли это порядок выполнения кода?
  • 1
    Обновил ответ в соответствии с вашими требованиями
-1

Для встроенной функции sorted вы можете предоставить настраиваемый key. Здесь достаточно, если ключевой метод возвращает кортеж столбцов 1 и 2, поэтому сначала будет рассмотрено значение столбца 1, а для строк, имеющих одинаковое значение в этом столбце, будет упорядочено по столбцу 2.

data = [['user_id', 'time', 'address'],
    ['F', 5, 5],
    ['B', 6, 6],
    ['T', 5, 8],
    ['K', 7, 7],
    ['J', 7, 9],
    ['M', 9, 10]]

data_sorted = [data[0]] + sorted(data[1:], key = lambda row: (row[1], row[2]))
  • 1
    Этот код даже не запускается. У вас есть синтаксическая ошибка в объявлении списка. Это также не имеет data[0] в качестве подсписка, но вместо этого как 3 элемента. Наконец, и, вероятно, самое главное, он не соответствует желаемому результату
  • 0
    Привет @deenes. Я забыл включить третье, важное условие, которое показывает, почему K не должен предшествовать T, даже если B должен предшествовать T. То есть, если разница между значениями в индексе 1 (время) больше или равна 2, затем строки должны быть отсортированы по столбцу индекса 1 (время). Таким образом, для T и K, поскольку значение 7 для K на 2 больше, чем значение 5 для T, T должно стоять первым. Но для B и T B предшествует T, потому что 6 только на 1 больше 7, поэтому разница во времени между B и T не превышает 2. Изменит ли это порядок выполнения кода?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню