如何在python中按列表顺序对dict进行排序

时间:2013-02-16 10:14:03

标签: python list sorting dictionary

例如a是dict,a = {1:2,2:3,3:4}b= [3,1]

我想对a进行排序,以获取一个元组列表,如果a中的键位于b中,请按b的顺序排序,否则将它们放入元组列表的结尾。

我这样做:

sorted(a.items(), key = lambda (k, v): b.index(k) if k in b else a.keys().index(k))

但是,我认为这是错误的。

所以我可以使用python来完成它。

由于

4 个答案:

答案 0 :(得分:4)

试试这个:

import sys
sorted(a.items(), key = lambda (k, v): b.index(k) if k in b else sys.maxint)

对于不在b中的键,我们返回一个非常大的值,将它们放在排序结果的末尾。

答案 1 :(得分:2)

处理特殊情况的一种好方法是使用元组作为排序键

>>> a = {1: 2, 2: 3, 3: 4}
>>> b= [3, 1]
>>> sorted(a.items(), key=lambda (k,v):(0, b.index(k)) if k in b else (1,))
[(3, 4), (1, 2), (2, 3)]

如果b很长,最好创建一个dict来加速索引查找

>>> b_dict = {k:v for v, k in enumerate(b)}
>>> sorted(a.items(), key=lambda (k,v):(k not in b_dict, b_dict.get(k)))
[(3, 4), (1, 2), (2, 3)]

答案 2 :(得分:0)

我不确定您想要的预期输出,但这可能会有所帮助:

a = {1:2,2:3,3:4}
b = [3,1]

r = [(x,a[x]) for x in b if x in a]

r作为列表:

[(3, 4), (1, 2)]

如果这不是预期的输出,可能有助于作为中间步骤。

答案 3 :(得分:0)

我认为这可以满足您的需求:

a = {1:2,2:3,3:4}
b = [3,1]

print ([(k,a[k]) for k in b if k in a] +
       [(k,a[k]) for k in a if k not in b])

输出:

[(3, 4), (1, 2), (2, 3)]

这也有效:

head, tail = [], []
any((head if k in b else tail).append((k,a[k]))
    for k in (b + [k2 for k2 in a if k2 not in b]))
print head+tail

我不会称之为排序a - 可能会对其进行排序。