Как отсортировать список, содержащий внутренние списки, по внутренним спискам в python

У меня есть список, содержащий списки, примеры:

table[0] = ['255.255.255.255', '58267', '233', 'ESTABLISHED']
table[1] = ['255.132.0.0', '38367', '273', 'CLOSED']

Я хочу отсортировать список "таблица" по внутреннему списку, например:

Я хотел бы отсортировать «таблицу» по алфавиту в соответствии со строкой, которая помещена в последний индекс в списке, который помещен в каждый индекс в «таблице». Это будет выглядеть так:

table[0] = ['255.132.0.0', '38367', '273', 'CLOSED']
table[1] = ['255.255.255.255', '58267', '233', 'ESTABLISHED']

Они поменялись местами, потому что «C» стоит перед «E».

Я пробовал это:

table.sort(key=lambda x: x.sort())

person Maya    schedule 20.12.2020    source источник


Ответы (2)


Попробуй это:

table.sort(key=lambda x: x[-1])

print(table)

Выход:

[['255.132.0.0', '38367', '273', 'CLOSED'], ['255.255.255.255', '58267', '233', 'ESTABLISHED']]
person IoaTzimas    schedule 20.12.2020
comment
@Maya, не могли бы вы кратко объяснить объяснение. Я тоже запутался, как это работает? - person thepunitsingh; 20.12.2020
comment
Поэтому я думаю, что код сортирует «таблицу» по тому, что находится на последнем месте внутреннего списка (x = внутренний список, x[-1] = последнее место внутреннего списка). Сортировка по умолчанию в алфавитном порядке :) - person Maya; 20.12.2020

Другой способ — использовать функцию argsort() numpy. Он возвращает индексы в том порядке, в котором они будут после сортировки.

import numpy as np
table = [['255.255.255.255', '58267', '233', 'ESTABLISHED'], ['255.132.0.0', '38367', '273', 'CLOSED']]

sorted_indexes = np.argsort([row[-1] for row in table])

sorted_table = np.array(table)[sorted_indexes]
# as list (and not numpy array):
sorted_table.tolist()

# [['255.132.0.0', '38367', '273', 'CLOSED'],
#  ['255.255.255.255', '58267', '233', 'ESTABLISHED']]

Но хорошая вещь с np.argsort() заключается в том, что он также работает с фреймами данных Pandas:

import pandas as pd
df = pd.DataFrame(table)

sorted_indexes = np.argsort(df.iloc[:, -1])

sorted_df = df.iloc[sorted_indexes, :]

sorted_df                                                                                             

#                  0      1    2            3
# 1      255.132.0.0  38367  273       CLOSED
# 0  255.255.255.255  58267  233  ESTABLISHED

# you can get numpy arrays by `.values`
# and from numpy array to normal lists by `.tolist()
# so:

sorted_df.values.tolist() 

# [['255.132.0.0', '38367', '273', 'CLOSED'],
#  ['255.255.255.255', '58267', '233', 'ESTABLISHED']]

Но у Pandas, конечно же, есть встроенная сортировка:

df.sort_values(by=[3])

И вы можете указать для by несколько имен столбцов или индексов столбцов, которые определяют приоритетные значения столбцов для сортировки. Используя .values.tolist(), вы можете повторно преобразовать фрейм данных обратно в простые списки.

person Gwang-Jin Kim    schedule 20.12.2020
comment
О, я не настолько продвинут в питоне, ха-ха, но спасибо! - person Maya; 20.12.2020
comment
@Maya для работы с таблицами - вы должны изучить pandas кадры данных как можно быстрее. Это сделает вашу жизнь намного проще. - person Gwang-Jin Kim; 20.12.2020
comment
Учебники @Maya на YouTube от Кори Шафера, например. отлично подходят для быстрого знакомства - person Gwang-Jin Kim; 20.12.2020
comment
Принято к сведению! Благодарю вас! - person Maya; 20.12.2020