2013-02-16 72 views
2

例如是一个字典,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

预期产量是多少? – Volatility 2013-02-16 10:16:59

+0

我认为这是很好的解决方案(如果它提出了正确的答案..这个else语句也许就是这样),更多pythonic的方式将使用[itertools](http://docs.python.org/2.7/library/itertools .html)magic – alonisser 2013-02-16 10:25:18

+0

您的测试数据过于狭窄,您的代码会得到与@mbatchkarov相同的结果 - 但是如果更改了示例数据,则输出会发生变化,但它们并不相同。 ''a = {2:9,9:7,6:5,5:6,1:2,9:8,2:3,4:5,3:4,6:7}' – sotapme 2013-02-16 11:27:25

回答

4

试试这个:

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

对于不在b的钥匙,我们返回一个非常大的价值,这使他们在排序结果的末尾。

+0

用'sys.maxint'好了 – alonisser 2013-02-16 10:25:59

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)] 

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

+0

我确实它像第一个版本一样,但我不符合需要。谢谢〜 – user710756 2013-02-16 10:23:12

+0

,我认为这可能会用一句话来完成,但我不知道该怎么做。 – user710756 2013-02-16 10:24:37

+0

我明白了,我认为mbatchkarov的回答是正确的。但是,如果下一次将预期输出添加到问题中,这将有所帮助,谢谢。 – 2013-02-16 10:34:12

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 - 也许订购它。

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为长,这是一个好主意,以创建一个字典,以加快索引查找

>>> 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)]