В настоящее время у меня есть небольшой скрипт, который занимает четыре списка, где, например, каждый 0-й индекс соответствует друг другу. Я сортирую эти списки по первому списку, в то время как другие списки сортируются по тому же шаблону. Вот так:
Несортированные списки:
list0: 4, 2, 1, 3
list1: четыре, два, один, три
Сортированные списки:
list0: 1, 2, 3, 4
list1: один, два, три, четыре
Это работает со следующим скриптом:
list0=IN[0]
list1=IN[1]
list2=IN[2]
list3=IN[3]
list0,list1,list2,list3 =zip(*sorted(zip(list0,list1,list2,list3)))
list0,list1,list2,list3 = (list(t) for t in zip(*sorted(zip(list0,list1,list2,list3))))
#Output:
OUT = [list0,list1,list2,list3]
Я хочу иметь возможность преобразовать это в более общий сценарий с любым количеством списков. Таким образом, мой ввод будет списком списков, и они должны быть отсортированы, как показано в коде выше. Можете ли вы помочь мне?
С наилучшими пожеланиями,
Просить
Это то, что вы ищите?
def sort_lists(*args):
zipped_list = zip(*sorted(zip(*args)))
return [list(l) for l in zipped_list]
Пример:
>>> l1 = [4,2,1,3]
>>> l2 = ["four", "two", "one", "three"]
>>> sort_lists(l1, l2)
[[1, 2, 3, 4], ['one', 'two', 'three', 'four']]
Основываясь на вашем примере кода, вы можете использовать его следующим образом:
>>> OUT = sort_lists(*IN)
IN
, который является произвольно большим (может содержать N списков внутри). Параметр *args
в функции позволяет ему принимать любое количество параметров, которые вы хотите добавить в функцию. Имея такой сценарий, вы можете использовать звездочку, чтобы разбить список списков на параметры внутри функции, поэтому вам не нужно писать его вручную. Не могли бы вы уточнить вопрос? фактически функция принимает в качестве входных данных список списков.
Еще один ответ на вопрос:
list_of_lists = [
[1, 2, 3, 0],
[1, 2, 3, 4],
[5, 6, 7, 8]]
dict_of_lists = {
'a': [1, 2, 3, 0],
'b': [1, 2, 3, 4],
'c': [5, 6, 7, 8]}
def sort_list_of_lists(lst, idx):
# idx - is index of list to use for sorting all the lists
return list(list(tup) for tup in zip(*sorted(zip(*lst), key=lambda x: x[idx])))
def sort_dict_of_lists(dct, key):
# key - is key of list to use for sorting all the lists
keys = list(dct.keys())
# get list from dict
lst = [dct[key_] for key_ in keys]
# get idx from key
idx = keys.index(key)
# use function 'sort_list_of_lists' for actual sorting
return {key_: lst_ for key_, lst_ in zip(keys, sort_list_of_lists(lst, idx))}
sorted_list_of_lists = sort_list_of_lists(list_of_lists, idx=0)
sorted_dict_of_lists = sort_dict_of_lists(dict_of_lists, key='a')
Если бы я столкнулся с такой проблемой, я бы использовал pandas
для ее решения - очень удобный и эффективный инструмент для обработки таблиц:
import pandas as pd
dataframe_from_list = pd.DataFrame(list_of_lists).T
dataframe_from_dict = pd.DataFrame(dict_of_lists)
dataframe_from_list.sort_values(by=0, inplace=True)
dataframe_from_dict.sort_values(by='a', inplace=True)
that
случае у вас есть IN
который является списком списков, я думаю. Вы можете просто использовать list_of_sorted_lists = sort_list_of_lists(IN[:4], idx=0)
. Если сортировка сложна, тогда вся ситуация усложняется. Вы можете улучшить определение ключа сортировки внутри функции sort_list_of_lists
, например, key=lambda x: key_second(x[idx])
. В этом случае вам также следует добавить еще один шаг сортировки с key_first
внутри функции sort_list_of_lists
.
Вы можете использовать следующую функцию:
def sort_ll(l1, *l):
return [sorted(l1)] + [sorted(i, key= lambda x: l1[i.index(x)]) for i in l]
пример
l1=[ 4, 2, 1, 3]
l2 = ['four', 'two', 'one', 'three']
l3 = ['apple', 'orange', 'peach', 'blueberries']
sort_ll(l1,l2,l3)
[[1, 2, 3, 4],
['one', 'two', 'three', 'four'],
['peach', 'orange', 'blueberries', 'apple']]