#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']]