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
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)
小智 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())
。
小智 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()进行迭代.
在 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}
对于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)
归档时间: |
|
查看次数: |
116161 次 |
最近记录: |