8

我想知道是否有更简单/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

我认为必须有更好的解决方案...

4

6 回答 6

21

你可以试试

d = dict(d.items()[:MAX_RESULTS])

在 Python 3 中:

d = dict(list(d.items())[:MAX_RESULTS])
于 2013-09-13T15:03:53.953 回答
6

您可以itertools.islice使用dict.iteritems.

dict.iteritems()在 py2.x 中返回一个迭代器,您可以使用对该迭代器进行切片itertools.islice并将其传递给以dict()获取新的 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
于 2013-09-13T15:05:19.303 回答
2

这会从字典中返回 4 的前 2 个元素(在 python 2.6 中)

elems = {'a': 2, 'b': 7, 'c': 3, 'd': 9}
dict((k, v) for k, v in elems.items() if k in elems.keys()[:2])
于 2013-09-13T15:05:04.320 回答
2

试试这个:

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
MAX_VALUES=2
d = {k: d[k] for k in d.keys()[:MAX_VALUES]}
于 2013-09-13T15:14:43.697 回答
1

需要注意的重要一点: 中的键dict没有排序,因此当您将其修剪到特定长度时,您将获得哪些键是不确定的。

在 python 2.7+ 中,

trimmed_results = {key : results_to_be_trimmed[key] 
                                            for key in in results_to_be_trimmed.keys()[0:4]}
于 2013-09-13T15:03:35.627 回答
0
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

d = {k: d[k] for k in list(d.keys())[:2]}

如果我不将列表应用于d.keys. 所以,不要忘记这样做。

于 2020-10-07T14:09:36.590 回答