Скажем, у меня есть этот массив
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]]
Если возможно, я бы хотел сделать это без Панд.
>>> 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]]
>>>
Для встроенной функции 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]))
data[0]
в качестве подсписка, но вместо этого как 3 элемента. Наконец, и, вероятно, самое главное, он не соответствует желаемому результату