2

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

我想排序a得到一个元组列表,如果键 in ab则按 的顺序对它们进行排序b,否则将它们放在元组列表的末尾。

我这样做:

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

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

所以我可以用python来做。

谢谢

4

4 回答 4

4

尝试这个:

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

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

于 2013-02-16T10:24:07.720 回答
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)]
于 2013-02-16T10:35:23.467 回答
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——也许是排序。

于 2013-02-16T10:33:06.407 回答
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)]

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

于 2013-02-16T10:22:04.143 回答