例如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来完成它。
由于
答案 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
- 可能会对其进行排序。