我想知道是否有一种更简单/ pythonic的方式来修剪python中字典的“大小/长度”。如果我有一个包含10个键值对(元素)的dict,并且我想将大小限制为5.在循环中删除元素是最佳解决方案(顺序/标识无关紧要)
def _trim_search_results(self):
MAX_RESULTS = 5
# a big dict
results_to_be_trimmed = {result_1 ... result_n}
# dict with length MAX_RESULTS
trimmed_results = {}
for index, key in enumerate(results_to_be_trimmed):
if index == MAX_RESULTS:
break
else:
trimmed_results[key] = results_to_be_trimmed[key]
results_to_be_trimmed = trimmed_results
我认为必须有更好的解决方案......
答案 0 :(得分:16)
你可以尝试
d = dict(d.items()[:MAX_RESULTS])
答案 1 :(得分:5)
您可以在itertools.islice
上使用dict.iteritems
。
dict.iteritems()
返回py2.x中的迭代器,您可以使用itertools.islice
对该迭代器进行切片并将其传递给dict()
以获取新的词典。
<强>演示:强>
>>> from itertools import islice
>>> d = dict.fromkeys(range(10))
>>> dict(islice(d.iteritems(), 5))
{0: None, 1: None, 2: None, 3: None, 4: None}
>>> d = dict.fromkeys(range(100))
>>> %timeit from itertools import islice;dict(islice(d.iteritems(), 10)) #winner
10000 loops, best of 3: 10.7 us per loop
>>> %timeit dict(d.items()[0: 10])
100000 loops, best of 3: 10.9 us per loop
>>> d = dict.fromkeys(range(10**5))
>>> %timeit from itertools import islice;dict(islice(d.iteritems(), 1000)) #winner
1000 loops, best of 3: 106 us per loop
>>> %timeit dict(d.items()[0: 1000])
100 loops, best of 3: 20 ms per loop
答案 2 :(得分:2)
这将从字典(在python 2.6中)中返回4的前2个元素
elems = {'a': 2, 'b': 7, 'c': 3, 'd': 9}
dict((k, v) for k, v in elems.items() if k in elems.keys()[:2])
答案 3 :(得分:1)
需要注意的重要一点:dict
中的键没有被排序,因此当您将其修剪到特定长度时,您将获得哪些键是不确定的。
在python 2.7 +中,
trimmed_results = {key : results_to_be_trimmed[key]
for key in in results_to_be_trimmed.keys()[0:4]}
答案 4 :(得分:1)
试试这个:
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
MAX_VALUES=2
d = {k: d[k] for k in d.keys()[:MAX_VALUES]}
答案 5 :(得分:0)
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
d = {k: d[k] for k in list(d.keys())[:2]}
如果我不对d.keys
申请清单,这对我就不起作用。因此,不要忘记这样做。