Как я могу отсортировать несколько списков Python на основе сортировки, примененной к одному списку?

#python-3.x #list #sorting

Вопрос:

У меня есть список списков на Python, которые по сути представляют собой таблицу. Я знаю, что для этого мне следовало бы использовать фрейм данных pandas, но ретроспектива-20/20. Я отвлекся…ниже приведен примерный список того, о чем я говорю.

Общая переменная списка состоит из этих вложенных списков:

 ['Store number', 2, 3, 4, 1, 5]
['Variable 1', 82, 99, 44, 32, 65]
['String 1', 'cat', 'dog', 'lizard', 'alligator', 'crocodile']
 

В текущем состоянии каждый индекс каждого вложенного списка соответствует одной и той же строке в таблице. Таким образом, для хранилища номер 2 переменная 1 равна 82, а строка 1-cat. Допустим, я хочу отсортировать каждый список по тому, где поддерживаются эти отношения, но мы сортируем по возрастанию номера магазина. Окончательные списки будут выглядеть так:

 ['Store number', 1, 2, 3, 4, 5]
['Variable 1', 32, 82, 99, 44, 65]
['String 1', 'alligator', 'cat', 'dog', 'lizard', 'crocodile']
 

Как я мог бы сделать это, используя мои текущие структуры данных?

Ответ №1:

Вы можете отсортировать список индексов из a range на основе значений в одном из ваших списков. Затем вы можете использовать индексы, чтобы изменить порядок исходных трех списков:

 store = ['Store number', 2, 3, 4, 1, 5]
var1 = ['Variable 1', 82, 99, 44, 32, 65]
str1 = ['String 1', 'cat', 'dog', 'lizard', 'alligator', 'crocodile']

sort_indexes = sorted(range(1, len(store)), key=lambda i:store[i])

store[1:] = [store[i] for i in sort_indexes]
var1[1:] = [var1[i] for i in sort_indexes]
str1[1:] = [str1[i] for i in sort_indexes]
 

С вашей структурой данных было бы намного приятнее работать, если бы заголовок для каждого столбца не содержался в одном и том же списке. Но эта неловкость на самом деле не сильно влияет на этот код, так как мы все равно не сортируем списки напрямую, вместо этого мы сортируем индексы, и на самом деле нет никаких проблем с этим, начиная с индекса 1 вместо 0 . Если вы переместите заголовки из данных, вы просто сможете пропустить назначение фрагмента в конце этого кода (просто используйте значения понимания списка напрямую).

Ответ №2:

Если вам необходимо использовать вашу текущую структуру данных, вот функция, которая будет делать то, что вы хотите. Обратите внимание, что, вероятно, существуют гораздо более разумные подходы, но это сработает.

подаренный:

 lolists = [['Store number', 2, 3, 4, 1, 5],
            ['Variable 1', 82, 99, 44, 32, 65],
            ['String 1', 'cat', 'dog', 'lizard', 'alligator', 'crocodile']      
            ]
def sortinnerLists(lol):
    kys = lol[0][1:]
    sortedKys = sorted(kys)
    rslt = [[lol[0][0]], [lol[1][0]], [lol[2][0]]]
    for v in sortedKys:
        indx = kys.index(v) 1
        rslt[0].append(v)
        rslt[1].append(lol[1][indx])
        rslt[2].append(lol[2][indx])
    return rslt    
sortinnerLists(lolists)  
 

доходность:

 [['Store number', 1, 2, 3, 4, 5],
 ['Variable 1', 32, 82, 99, 44, 65],
 ['String 1', 'alligator', 'cat', 'dog', 'lizard', 'crocodile']]