Python 如何从已排序的词典中获取前n项?

Python 如何从已排序的词典中获取前n项?,python,Python,我有一本有单词和频率的分类词典: words = {'dog':8, 'cat':7, 'pig':4 ......} 有没有一种优雅的方式来挑选前3项?因此,它最终会: words = {'dog':8, 'cat':7, 'pig':4} 我可以设置一个阈值k=3并执行for循环,但是有更好的方法吗?因为单词频率是整数,所以您可以在循环中使用该方法。您甚至可以首先使用计数器方便地获取频率: >>>从收款进口柜台 >>>句子=‘黑猫坐在地板上的黑垫子上’ >>>freqs=Counters

我有一本有单词和频率的分类词典:

words = {'dog':8, 'cat':7, 'pig':4 ......}
有没有一种优雅的方式来挑选前3项?因此,它最终会:

words = {'dog':8, 'cat':7, 'pig':4}

我可以设置一个阈值k=3并执行for循环,但是有更好的方法吗?

因为单词频率是整数,所以您可以在循环中使用该方法。您甚至可以首先使用计数器方便地获取频率:

>>>从收款进口柜台 >>>句子=‘黑猫坐在地板上的黑垫子上’ >>>freqs=Countersentence.split >>>最常见的频率3 [the',3',black',2',on',2] 它返回一个对列表,因此如果希望将结果作为字典,可以使用dict构造函数:

>>>最普通的口述 {'the':3,'black':2,'on':2} 请尝试此代码

>>> from itertools import islice
>>> words = {'dog':8, 'cat':7, 'pig':4, 'rabbit': 3}
>>> dict(islice(words.items(), 3))
{'dog': 8, 'cat': 7, 'pig': 4}

从技术上讲,它仍然是一个for循环,但可能更优雅

{x:words[x] for x in list(words)[0:3]}
需要Python 3.6+:

>>> k = 3
>>> words = {'dog':8, 'cat':7, 'pig':4, 'cow':8}
>>> dict([z for i,z in enumerate(words.items()) if i<k])
{'dog': 8, 'cat': 7, 'pig': 4}
说明:.items方法以元组的形式返回键值对,因此当您执行列表理解[z for i,z in enumeratewords.items if i如果您使用的是Python 3.6或更低版本,则返回元组列表:

无法使用常规python字典进行此操作,因为这些字典从不排序。如果需要排序字典,请使用collections和OrderedDict类来存储字典

words = OrderedDict(list(words.items())[:n])
如果您使用的是Python 3.7+

您可以在不使用itertools的情况下使用此代码:


如何对字典进行排序?Python没有任何类型的对象称为排序字典。这是您实现的还是您说排序后需要字典的前3项?我自己对它进行了排序,因此它是一个排序的字典。可能对键列表进行排序,只对键中的k进行排序[:3]:?@Denis,OP说他们想要一个更好的方法来完成它,而不是for循环。这甚至没有给出正确的答案。检查你的Python版本。这取决于字典的顺序,这只是Python 3.6+中的默认值。我没有测试,但基于你的输入和输出,很明显它没有给出正确的答案。cow是8,但它是我的它不在输出列表中。我猜您假设字典已排序。嗯……这就是重点,@smttsp。我们只想保留前三个元素-这意味着这是一个有效的答案。这只适用于Python 3.6+,因为这是在Python dicts被排序时。如果单词是按正确顺序排序的,则编辑在任何版本的Python中都有效,如OP的ca中se.前3项是[:3]。我有:d={'a':1,'c':3,'b':2},使用dictlistd.items[:2]和get:{'a':1,'c':3}-我做错了什么吗不,你没有。这是预期的结果!这段代码应该从字典中获取前两个元素,这就是这里发生的情况。你期望的输出是什么?
words = dict(list(words.items())[:n])