8

Python で辞書の「サイズ/長さ」をトリミングするための、よりシンプルで Pythonic な方法があるかどうかを知りたいです。10 個のキーと値のペア (要素) を持つ dict があり、サイズを 5 に制限したい場合は、ループ内の要素を削除することが最善の解決策です(順序/ID は関係ありません)。

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

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

これを試して:

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 に答える