我需要基于键排序字典,然后返回与这些键相关的值。按键排序Python中的字典
ages = {40 : 'mother', 38 : 'father', 17 : 'me'}
['me', 'father', 'mother'] # Should return this
什么是这样做的最快的方式(表现为对我来说真的一个问题,因为排序得到在我的代码调用数千次)。
非常感谢!
我需要基于键排序字典,然后返回与这些键相关的值。按键排序Python中的字典
ages = {40 : 'mother', 38 : 'father', 17 : 'me'}
['me', 'father', 'mother'] # Should return this
什么是这样做的最快的方式(表现为对我来说真的一个问题,因为排序得到在我的代码调用数千次)。
非常感谢!
因为你的钥匙是数字和超过字典默认迭代器返回键 - 你可以直接按键排序:
>>> ages = {40:'mother', 38:'father', 17:'me'}
>>> [ages[k] for k in sorted(ages)]
['me', 'father', 'mother']
虽然技术上它不排序字典,它给OP所需的输出。 –
字典默认情况下不是“可排序的”。 –
@MarkusUnterwaditzer:那么OP要求输出一个特定的输出。由于这个答案提供了它,我认为这是正确的。 – rubik
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')
无法排序字典由于这类藏品的性质。虽然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.
你不需要添加'.keys()',默认情况下字典是通过它们的键迭代的。 –
是的。感谢您的纠正。 –
另一方面,.keys()/ .iterkeys()是一个显式调用,可以快速了解左侧的变量类型。 –
这不是有效的Python语法,你有一个关键那是一个字符串。这是一个错误吗? –
如果在代码中调用了数千次排序,则可能需要缓存一些结果或使用有序字典。 –
请使用':'分隔key:值。 – kev