根据另一个列表对列表列表进行排序

时间:2013-09-12 16:56:05

标签: python list sorting

如何根据lista中的项目顺序对sorter_list进行排序:

lista = [["John", "B3"],["Robert", "P3"], ["Thomas", "S2"]]

sorter_list = ["P3", "S2", "B3"]

结果将是:

sorted_lista = [ ["Robert", "P3"], ["Thomas", "S2"], ["John", "B3"]]

此致

5 个答案:

答案 0 :(得分:7)

假设sorter_list中始终存在与lista中每个列表的第二个元素匹配的条目:

sorted_lista = sorted(lista, key=lambda lst: sorter_list.index(lst[1]))

答案 1 :(得分:3)

虽然@ F.J有一个完美的解决方案,但我的问题是,你为什么不首先使用字典来存储这类数据呢?

使用字典:

d = {'B3': 'John', 'P3': 'Robert', 'S2': 'Thomas'}
sorter = ["P3", "S2", "B3"]
print([(d[key], key) for key in sorter])

输出:

[('Robert', 'P3'), ('Thomas', 'S2'), ('John', 'B3')]

加号:您还应该检查collections模块的OrderedDict

<强>更新

当然,您可以将值存储为列表,因此可以包含多个值:

使用字典:

d = {'B3': [('John', 123)], 'P3': [('Robert', 465), ('Andres', 468)], 'S2': [('Thomas', 19)]}
sorter = ('P3', 'B3', 'S2')
print([(d[key], key) for key in sorter])

输出:

[([('Robert', 465), ('Andres', 468)], 'P3'), ([('John', 123)], 'B3'), ([('Thomas', 19)], 'S2')]

在这种情况下,您还可以在字典中使用字典:

d = {'B3': {'John': 123}, 'P3': {'Robert': 465, 'Andres': 468}, 'S2': {'Thomas': 19}}

以后查找会更容易。

答案 2 :(得分:1)

您可以在O(N)中通过构建字典来执行此操作,其中您的密钥为B3S2等。

lookup_dict = dict( (item[1],item) for item in lista)
sorted_lista = [ lookup_dict[key] for key in sorter_list ]

这利用了您的sorter_list已经排序的事实。

答案 3 :(得分:1)

为了有效排序,我认为最好从sorter_list

创建字典
sorter_dict = {x:i for i, x in enumerate(sorter_list)}
sorted_lista = sorted(lista, key=lambda lst: sorter_dict[lst[1]])

答案 4 :(得分:1)

我是python的新手,所以它可能不是最优化的解决方案

sorted_lista=[]

for i in sorter_list:
    for j in lista:
        if i==j[1]:
            sorted_lista.append([j[0],j[1]])

print sorted_lista

输出:

[['Robert', 'P3'], ['Thomas', 'S2'], ['John', 'B3']]