2012-10-14 93 views
0

我需要基于键排序字典,然后返回与这些键相关的值。按键排序Python中的字典

ages = {40 : 'mother', 38 : 'father', 17 : 'me'} 
['me', 'father', 'mother'] # Should return this 

什么是这样做的最快的方式(表现为对我来说真的一个问题,因为排序得到在我的代码调用数千次)。

非常感谢!

+2

这不是有效的Python语法,你有一个关键那是一个字符串。这是一个错误吗? –

+1

如果在代码中调用了数千次排序,则可能需要缓存一些结果或使用有序字典。 –

+1

请使用':'分隔key:值。 – kev

回答

4

因为你的钥匙是数字和超过字典默认迭代器返回键 - 你可以直接按键排序:

>>> ages = {40:'mother', 38:'father', 17:'me'} 
>>> [ages[k] for k in sorted(ages)] 
['me', 'father', 'mother'] 
+0

虽然技术上它不排序字典,它给OP所需的输出。 –

+0

字典默认情况下不是“可排序的”。 –

+0

@MarkusUnterwaditzer:那么OP要求输出一个特定的输出。由于这个答案提供了它,我认为这是正确的。 – rubik

3

利用的sorted()zip()功能:

zip(*sorted(ages.items(), key=lambda item: item[0]))[1] 

第一它将词典分类以创建元组列表(项目):

>>> sorted(ages.items()) 
[(17, 'me'), (38, 'father'), (40, 'mother')] 

然后只需要值:

>>> zip(*sorted(ages.items())[1] 
('me', 'father', 'mother') 

附:如果字典非常大,您可能需要考虑使用dict.iteritems(),它在Python 2上返回一个迭代器。在Python 3中,这是默认行为,它由dict.items()提供。


替代的解决方案 - 使用operator.itemgetter()

>>> import operator 
>>> operator.itemgetter(*sorted(ages))(ages) 
('me', 'father', 'mother') 
+0

'key = lambda item:item [0]'是默认值,您可以放心地忽略它。 – georg

+0

@ thg435:好的,谢谢你指出! – rubik

2

无法排序字典由于这类藏品的性质。虽然Python的为您提供了几种选择:要么使用OrderedDict(保持插入键/值对的顺序),或者只是按键,例如::排序

ages = {40 : 'mother', 38 : 'father', 17 : 'me'} 
ages_sorted = sorted(ages) 
# or ages.iterkeys()/.keys() (in Py3) which is a bit self-explanatory. 
+0

你不需要添加'.keys()',默认情况下字典是通过它们的键迭代的。 –

+0

是的。感谢您的纠正。 –

+0

另一方面,.keys()/ .iterkeys()是一个显式调用,可以快速了解左侧的变量类型。 –