将字典拆分为2个字典

时间:2012-10-20 12:18:00

标签: python

将字典分成两半的最佳方法是什么?

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

我希望这样做:

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

每个字典中的哪些键/值都无关紧要。我只是在寻找将字典分成两部分的最简单方法。

9 个答案:

答案 0 :(得分:19)

这可行,但我没有测试边缘情况:

>>> 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}

答案 1 :(得分:7)

这是使用迭代器对字典中的项目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

答案 2 :(得分:4)

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}

答案 3 :(得分:3)

如果你使用python +3.3,并希望你的分割词典在不同的python调用中是相同的,不要使用.items,因为键的哈希值决定了{的顺序{1}}将在python调用之间进行更改。 见Hash randomization


答案 4 :(得分:3)

The answer by jone对我不起作用。在我可以索引.items()调用的结果之前,我必须转换为列表。 (我在示例中运行Python 3.6

d = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5}
split_idx = 3
d1 = dict(list(d.items())[:split_idx])
d2 = dict(list(d.items())[split_idx:])

"""
output:
d1
{'one': 1, 'three': 3, 'two': 2}
d2
{'five': 5, 'four': 4}
"""

请注意,dicts不一定按创建顺序存储,因此索引可能会混淆。

答案 5 :(得分:2)

这是可用于将字典拆分为任何分区的函数。

g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

Runtime transformA: 444 ms
Runtime transformB: 796 ms
Runtime transformC: 434 ms

答案 6 :(得分:1)

我们可以使用itertools.zip_longest()有效地做到这一点(注意这是2.x中的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}

答案 7 :(得分:0)

如果您使用numpy,则可以执行以下操作:

def divide_dict(dictionary, chunk_size):

'''
Divide one dictionary into several dictionaries

Return a list, each item is a dictionary
'''

import numpy, collections

count_ar = numpy.linspace(0, len(dictionary), chunk_size+1, dtype= int)
group_lst = []
temp_dict = collections.defaultdict(lambda : None)
i = 1
for key, value in dictionary.items():
    temp_dict[key] = value
    if i in count_ar:
        group_lst.append(temp_dict)
        temp_dict = collections.defaultdict(lambda : None)
    i += 1
return group_lst

答案 8 :(得分:0)

这是我在Python 3.8中使用的函数,可以将字典拆分为包含所需数量的部件的列表。如果您指定的零件多于元素,那么结果列表中将出现一些空的字典。

def split_dict(input_dict: dict, num_parts: int) -> list:
    list_len: int = len(input_dict)
    return [dict(list(input_dict.items())[i * list_len // num_parts:(i + 1) * list_len // num_parts])
        for i in range(num_parts)]

输出:

>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
>>> split_dict(d, 2)
[{'a': 1, 'b': 2}, {'c': 3, 'd': 4, 'e': 5}]
>>> split_dict(d, 3)
[{'a': 1}, {'b': 2, 'c': 3}, {'d': 4, 'e': 5}]
>>> split_dict(d, 7)
[{}, {'a': 1}, {'b': 2}, {}, {'c': 3}, {'d': 4}, {'e': 5}]