【问题标题】:Sorting list of lists by the first list按第一个列表对列表进行排序
【发布时间】:2019-01-09 11:57:26
【问题描述】:

我目前编写了一个小脚本,其中包含四个列表,例如,每个第 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]

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

最好的问候,

【问题讨论】:

  • 如果是列表的列表,将问题的标题改为“按第一个列表排序列表列表”而不是“按第一个列表排序字典”不是更好吗列表”?字典默认是无序的,对我来说,谈论字典中的第一个元素是没有意义的,因为不能保证及时保持顺序。

标签: python


【解决方案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)

【讨论】:

  • 您的函数可以工作,但正如现在所写的那样,我似乎必须将每个输入列表分别写入函数的变量中。这意味着,随着我的输入列表数量不同,它并不能完全解决问题。现在它将列表列表视为一个列表,因此无法正确排序。您如何使列表列表成为输入?顺便说一句,感谢您的宝贵时间。
  • “我似乎必须在函数中的变量中分别写入每个输入列表” 是什么意思?到目前为止,我知道您有一个列表列表,称为IN,它任意大(可能包含 N 个列表)。函数中的参数*args 允许它接受要附加到函数的任意数量的参数。有了这个场景,你可以使用星号将列表列表分解成函数内部的参数,这样就不需要手动编写了。你能澄清一下这个问题吗?实际上,该函数接受一个列表作为输入。
  • 嗯,我对 Python 很陌生,所以我根本不了解它的这一方面。我现在可以看到解决了它,但我不知道可变数量参数 (*args) 函数的能力。
【解决方案2】:

问题的另一个答案:

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)

【讨论】:

  • 我想加入熊猫。你有什么方法可以进入吗?我记得您不久前回答了我的一个关于特定于索引的排序的问题:stackoverflow.com/a/53596807/10722189您如何将其应用于该列表排序?我正在尝试将 list-of-lists 方法应用于该代码。
  • @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])。在这种情况下,您还应该在函数sort_list_of_lists 内添加另一个排序步骤key_first
  • 到目前为止我已经写了这个:collabedit.com/533xy。我收到错误代码: Traceback(最近一次调用最后一次):文件“”,第 32 行,在 文件“”,第 28 行,在 sort_list_of_lists 文件“”中,第 28 行,在 文件“”中,第 19 行,在 key_second IndexError: index out of range: 1 中。你能看出哪里出错了吗?我的输入是 9 个列表的列表,其中第 0 个索引是用作排序掩码的标题列表。
  • @Ask 在当前版本中,idx 是在函数 sort_list_of_lists 内部定义和使用的,所以函数 key_second 获取单个元素(我猜是字符串)而不是元组。所以在函数key_second 内部使用string 而不是string[0]。这同样适用于函数key_first
  • 有道理。我更正了它,它给了我完全相同的错误代码。我已经发送了有关代码共享器的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多