我目前编写的一个小脚本包含四个列表,例如,每个第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]
我希望能够将其转换为具有任意数量列表的更通用的脚本。因此,我的输入将是一个列表列表,并且应该按照上面的代码所示对它们进行排序。你能帮我吗?
最诚挚的问候,
询问
答案 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)