Сортировка списка списков по первому списку

1

В настоящее время у меня есть небольшой скрипт, который занимает четыре списка, где, например, каждый 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]

Я хочу иметь возможность преобразовать это в более общий сценарий с любым количеством списков. Таким образом, мой ввод будет списком списков, и они должны быть отсортированы, как показано в коде выше. Можете ли вы помочь мне?

С наилучшими пожеланиями,

Просить

  • 1
    Если это список списков, не лучше ли изменить название вопроса на «Сортировка списка списков по первому списку» вместо «Сортировка словаря списков по первому списку»? словари по умолчанию неупорядочены, для меня не имеет смысла говорить о первом элементе в словаре, поскольку не гарантируется порядок, который будет сохраняться во времени.
Теги:

3 ответа

1
Лучший ответ

Это то, что вы ищите?

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)
  • 0
    Ваша функция работает, но, как она написана сейчас, мне кажется, что я должен написать в каждом входном списке отдельно в переменной в функции. Это означает, что, поскольку мое количество входных списков меняется, это не решает проблему полностью . Прямо сейчас он обрабатывает список списков как один список и поэтому не сортирует его должным образом. Как бы вы сделали возможным создание списка списков для ввода? Спасибо за ваше время, кстати.
  • 0
    Что ты имеешь в виду под словом «мне, похоже, приходится писать в каждом входном списке отдельно в переменной в функции» ? Насколько я понимаю, у вас есть список списков, называемый IN , который является произвольно большим (может содержать N списков внутри). Параметр *args в функции позволяет ему принимать любое количество параметров, которые вы хотите добавить в функцию. Имея такой сценарий, вы можете использовать звездочку, чтобы разбить список списков на параметры внутри функции, поэтому вам не нужно писать его вручную. Не могли бы вы уточнить вопрос? фактически функция принимает в качестве входных данных список списков.
Показать ещё 1 комментарий
0

Еще один ответ на вопрос:

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)
  • 0
    Я хотел бы попасть в Панду. Вы рекомендуете какой-нибудь способ войти в это? Я помню, как вы недавно отвечали на мой вопрос о сортировке по индексу : stackoverflow.com/a/53596807/10722189 Как бы вы применили это к сортировке списка? Я пытаюсь применить метод list-of-lists к этому коду.
  • 0
    @Ask В 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 .
Показать ещё 3 комментария
0

Вы можете использовать следующую функцию:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню