Python - 返回第一个N键:来自dict的值对

Jas*_*pel 78 python dictionary

考虑以下字典,d:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Run Code Online (Sandbox Code Playgroud)

我想从d返回前N个键:值对(在这种情况下N <= 4).这样做最有效的方法是什么?

Mar*_*ers 91

没有这样的"前n"键,因为dict它不记得先插入了哪些键.

您可以获得任何 n个键值对:

n_items = take(n, d.iteritems())
Run Code Online (Sandbox Code Playgroud)

这使用了take来自itertools食谱的实现:

from itertools import islice

def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))
Run Code Online (Sandbox Code Playgroud)

看到它在线工作:ideone

  • 我相信`iteritems`应该替换为Python 3上的人们的`items` (33认同)
  • 初学者 - `take()` 是 python 代码库的一部分吗?或者,这纯粹是您在此处的答案中定义的函数吗?询问它是否是代码库的一部分,我无法找到/导入它。:) (21认同)
  • **这个答案在 python 3.7+ 中不再有效**请参阅我的更新答案 /sf/answers/4516176171/ (7认同)
  • **这个答案不再正确**。Python 字典现在保留插入顺序,并且这是明确记录的。 (4认同)
  • @ScottBorden `take()` 现在属于 `more-itertools` 包 - /sf/answers/4480681061/ (3认同)

mon*_*ker 65

检索任何东西的一种非常有效的方法是将列表或字典理解与切片相结合.如果您不需要订购商品(您只需要n个随机对),您可以使用这样的字典理解:

# Python 2
first2pairs = {k: mydict[k] for k in mydict.keys()[:2]}
# Python 3
first2pairs = {k: mydict[k] for k in list(mydict)[:2]}
Run Code Online (Sandbox Code Playgroud)

通常,像这样的理解总是比等效的"for x in y"循环更快.此外,通过使用.keys()来创建字典键列表并切换该列表,可以避免在构建新字典时"触摸"任何不必要的键.

如果您不需要键(仅限值),则可以使用列表推导:

first2vals = [v for v in mydict.values()[:2]]
Run Code Online (Sandbox Code Playgroud)

如果您需要根据其键排序的值,则不会有太多麻烦:

first2vals = [mydict[k] for k in sorted(mydict.keys())[:2]]
Run Code Online (Sandbox Code Playgroud)

或者如果您还需要钥匙:

first2pairs = {k: mydict[k] for k in sorted(mydict.keys())[:2]}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想选择 N 个键:值对作为字典而不是列表,这是一个更好的解决方案 (3认同)

小智 24

要从 Python 字典中获取前 N 个元素,可以使用以下代码行:

list(dictionaryName.items())[:N]
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以将其更改为:

list(d.items())[:4]
Run Code Online (Sandbox Code Playgroud)


use*_*245 15

您可以通过调用.items()词典来获取词典项目。然后将其转换为 alist并从那里获取前 N 个项目,就像在任何列表中一样。

下面的代码打印字典对象的前 3 项

例如

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

first_three_items = list(d.items())[:3]

print(first_three_items)
Run Code Online (Sandbox Code Playgroud)

输出:

[('a', 3), ('b', 2), ('c', 3)]
Run Code Online (Sandbox Code Playgroud)


Pey*_*man 12

不幸的是,大多数答案都不是有效的。这是我所知道的最有效的方法。Wered是你的字典,n是印刷号码:

for idx, k in enumerate(d):
  if idx == n: break
  print((k, d[k]))
Run Code Online (Sandbox Code Playgroud)

这里的idx意思是索引,k意思是键。因此d[k]将是价值。

将字典转换为列表可能会很慢:

您的字典可能太大,您不需要仅仅为了打印前几个字典而转换所有字典。和list(d.items())都很list(d.keys())慢。

时间性能比较:

这是三种方法的时间比较。生成长度为 10 到 1000 的随机字典,并打印它们的前 5 个元素。正如你所看到的,性能enumerate(d)是 O(1) 并且不会因字典的长度而改变。list(d.items())对于 O(n) 的和 ,情况并非如此list(d.keys())在此输入图像描述

  • for 循环 `for idx, (k, v) in enumerate(d):` 应该是 `for idx, (k, v) in enumerate(d.items()):` 这样 (k,v) 元组被退回? (2认同)

小智 11

Python dict没有订购,所以要求"前N"键是没有意义的.

collections.OrderedDict如果您需要,该课程可用.你可以有效地获得它的前四个元素

import itertools
import collections

d = collections.OrderedDict((('foo', 'bar'), (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')))
x = itertools.islice(d.items(), 0, 4)

for key, value in x:
    print key, value
Run Code Online (Sandbox Code Playgroud)

itertools.islice允许你懒洋洋地从任何迭代器中获取一片元素.如果您希望结果可重用,则需要将其转换为列表或其他内容,如下所示:

x = list(itertools.islice(d.items(), 0, 4))
Run Code Online (Sandbox Code Playgroud)


小智 8

foo = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
iterator = iter(foo.items())
for i in range(3):
    print(next(iterator))
Run Code Online (Sandbox Code Playgroud)

基本上,将视图(dict_items)转换为迭代器,然后使用next()进行迭代.

  • 妙极了的答案,这是此页面上唯一对我有用且可读的答案。另外,我可以验证它是否可以在Python 3上使用,某些较旧的答案似乎没有。 (2认同)

far*_*zov 7

在 py3 中,这可以解决问题

{A:N for (A,N) in [x for x in d.items()][:4]}
Run Code Online (Sandbox Code Playgroud)

{'a':3,'b':2,'c':3,'d':4}


Avi*_*vio 6

对于Python 3.8,正确答案应该是:

import more_itertools

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

first_n = more_itertools.take(3, d.items())
print(len(first_n))
print(first_n)
Run Code Online (Sandbox Code Playgroud)

谁的输出是:

3
[('a', 3), ('b', 2), ('c', 3)]
Run Code Online (Sandbox Code Playgroud)

之后pip install more-itertools当然。


小智 5

在这里没有看到它。如果只需要从字典中提取一些元素,则不会在语法上排序,而是在语法上最简单。

n = 2
{key:value for key,value in d.items()[0:n]}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了您的代码,但出现此错误:`TypeError:'dict_items'对象无法下标``{key:密钥的值,stocks.items()[0:n]}}中的值(stocks是我的名字字典) (6认同)
  • @Moondra - 在运行字典项目之前必须转换为列表。上面的代码,如果 {key:value for key,value in list(d.items())[0:n]} (3认同)