31

辞書を半分に分割する最良の方法は何ですか?

d = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}

私はこれをしたいと思っています:

d1 = {'key1': 1, 'key2': 2, 'key3': 3}
d2 = {'key4': 4, 'key5': 5}

どのキー/値が各辞書に入るかは関係ありません。私は単に辞書を2つに分割する最も簡単な方法を探しています。

4

9 に答える 9

36

エッジケースはテストしていませんが、これは機能します。

>>> d = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}
>>> d1 = dict(d.items()[len(d)/2:])
>>> d2 = dict(d.items()[:len(d)/2])
>>> print d1
{'key1': 1, 'key5': 5, 'key4': 4}
>>> print d2
{'key3': 3, 'key2': 2}

python3の場合:

d = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}
d1 = dict(list(d.items())[len(d)//2:])
d2 = dict(list(d.items())[:len(d)//2])

また、アイテムの注文は保証されませんのでご注意ください

于 2012-10-20T12:27:10.383 に答える
8

ディクショナリ内のアイテムに対してイテレータを使用してそれを行う方法を次に示しますitertools.islice

import itertools

def splitDict(d):
    n = len(d) // 2          # length of smaller half
    i = iter(d.items())      # alternatively, i = d.iteritems() works in Python 2

    d1 = dict(itertools.islice(i, n))   # grab first n items
    d2 = dict(i)                        # grab the rest

    return d1, d2
于 2012-10-20T12:32:57.043 に答える
7
d1 = {key: value for i, (key, value) in enumerate(d.viewitems()) if i % 2 == 0}
d2 = {key: value for i, (key, value) in enumerate(d.viewitems()) if i % 2 == 1}
于 2012-10-20T12:22:36.697 に答える
1

これを効率的に行うことができます(これは2.x にあることにitertools.zip_longest()注意してください)。itertools.izip_longest()

from itertools import zip_longest
d = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}
items1, items2 = zip(*zip_longest(*[iter(d.items())]*2))
d1 = dict(item for item in items1 if item is not None)
d2 = dict(item for item in items2 if item is not None)

これにより、次のことがわかります。

>>> d1
{'key3': 3, 'key1': 1, 'key4': 4}
>>> d2
{'key2': 2, 'key5': 5}
于 2012-10-20T12:36:01.440 に答える