按第一个列表对列表进行排序

时间:2019-01-09 11:57:27

标签: python

我目前编写的一个小脚本包含四个列表,例如,每个第0个索引彼此匹配。我将这些列表按第一个列表排序,而其他列表则以相同的模式排序。像这样:

未排序列表:

列表0:4、2、1、3

列表1:4、2、1、3

排序列表:

列表0:1、2、3、4

列表1:1、2、3、4

这适用于以下脚本:

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]

我希望能够将其转换为具有任意数量列表的更通用的脚本。因此,我的输入将是一个列表列表,并且应该按照上面的代码所示对它们进行排序。你能帮我吗?

最诚挚的问候,

询问

2 个答案:

答案 0 :(得分: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)

答案 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)