Python 把字典一分为二?

Python 把字典一分为二?,python,dictionary,Python,Dictionary,把字典一分为二的最好方法是什么 d = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5} 我希望这样做: d1 = {'key1': 1, 'key2': 2, 'key3': 3} d2 = {'key4': 4, 'key5': 5} 哪些键/值进入每个字典并不重要。我只是在寻找将词典一分为二的最简单的方法。这会起作用,尽管我没有测试边缘情况: d1 = {key: value for i, (key, value) in e

把字典一分为二的最好方法是什么

d = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}
我希望这样做:

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

哪些键/值进入每个字典并不重要。我只是在寻找将词典一分为二的最简单的方法。

这会起作用,尽管我没有测试边缘情况:

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

还要注意的是,项目的顺序不保证

这里有一种方法,可以使用迭代器对字典和
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.x中):

这给了我们:

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

如果您使用
python+3.3
,并且希望分割的词典在不同的python调用中是相同的,那么不要使用
.items
,因为键的散列值决定了
.items()
的顺序在python调用之间会发生变化。 看



这是一个函数,可用于将字典拆分为任何分区

import math

def linch_dict_divider(raw_dict, num):
    list_result = []
    len_raw_dict = len(raw_dict)
    if len_raw_dict > num:
        base_num = len_raw_dict / num
        addr_num = len_raw_dict % num
        for i in range(num):
            this_dict = dict()
            keys = list()
            if addr_num > 0:
                keys = raw_dict.keys()[:base_num + 1]
                addr_num -= 1
            else:
                keys = raw_dict.keys()[:base_num]
            for key in keys:
                this_dict[key] = raw_dict[key]
                del raw_dict[key]
            list_result.append(this_dict)

    else:
        for d in raw_dict:
            this_dict = dict()
            this_dict[d] = raw_dict[d]
            list_result.append(this_dict)

    return list_result

myDict = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}
print myDict
myList = linch_dict_divider(myDict, 2)
print myList
不适合我。在索引.items()调用的结果之前,我必须强制转换到列表。(我正在运行示例中的Python 3.6


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

如果使用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

下面是我在Python3.8中使用的一个函数,它可以将dict拆分为包含所需数量的部分的列表。如果指定的部分多于元素,则结果列表中会出现一些空的dict

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

你对二分之二的定义是什么,你是说每本字典中有一半的键吗?边格不是问题;超出范围的片只返回空列表,对空列表调用dict返回空字典。但是:似乎表明Python规范并不保证每次调用items()都会以相同的顺序返回对!也许,从理论上讲是正确的,我们应该存储对items()调用的结果,然后对存储的结果进行切片?@MarkAmery我相信它们是稳定的,也就是说,只要字典没有任何变化,它们将以相同的顺序返回,尽管顺序是任意的,因此,这应该是正确的。稳定或不调用
items()
两次都不是一个好主意。我知道这已经很古老了,但作为读者的提醒:items()可能会改变当前Python版本中的顺序。如果需要,请使用
collections.OrderedDict
。python3>TypeError:“dict_items”对象不是可下标+1,但
{key:d[key]对于i,在枚举(d)中键入更简单。
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}]