如何快速将字典拆分成多个字典

时间:2014-04-05 08:57:06

标签: python python-2.7 dictionary

我找到了一个解决方案,但它确实很慢:

def chunks(self,data, SIZE=10000):
    for i in xrange(0, len(data), SIZE):
        yield dict(data.items()[i:i+SIZE])

如果不使用外部模块(numpy等),你有什么想法吗?

5 个答案:

答案 0 :(得分:39)

由于字典太大了,最好将所涉及的所有项目保持为迭代器和生成器,就像这样

from itertools import islice

def chunks(data, SIZE=10000):
    it = iter(data)
    for i in xrange(0, len(data), SIZE):
        yield {k:data[k] for k in islice(it, SIZE)}

示例运行

for item in chunks({i:i for i in xrange(10)}, 3):
    print item

<强>输出

{0: 0, 1: 1, 2: 2}
{3: 3, 4: 4, 5: 5}
{8: 8, 6: 6, 7: 7}
{9: 9}

答案 1 :(得分:2)

另一种方法是迭代器压缩:

>>> from itertools import izip_longest, ifilter
>>> d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8}

创建一个包含dict迭代器副本的列表(副本数是结果序列中的元素数)。通过将每个迭代器从chunks列表传递到izip_longest,您将从源代码中获取所需数量的元素(ifilter用于从zip结果中删除None)。使用生成器表达式可以降低内存使用量:

>>> chunks = [d.iteritems()]*3
>>> g = (dict(ifilter(None, v)) for v in izip_longest(*chunks))
>>> list(g)
[{'a': 1, 'c': 3, 'b': 2},
 {'e': 5, 'd': 4, 'g': 7},
 {'h': 8, 'f': 6}]

答案 2 :(得分:0)

此代码使用一个大词典,并将其拆分为小词典列表。 max_limit变量用于告知子词典中允许的最大键值对数量。 这段代码不需要花费很多精力来破坏字典,只需对字典对象进行一次完整的解析即可。

import copy
def split_dict_to_multiple(input_dict, max_limit=200):
"""Splits dict into multiple dicts with given maximum size. 
Returns a list of dictionaries."""
chunks = []
curr_dict ={}
for k, v in input_dict.items():
    if len(curr_dict.keys()) < max_limit:
        curr_dict.update({k: v})
    else:
        chunks.append(copy.deepcopy(curr_dict))
        curr_dict = {k: v}
# update last curr_dict
chunks.append(curr_dict)
return chunks

答案 3 :(得分:0)

对于 Python 3+。

xrange() 在 Python 3+ 中被重命名为 range()

你可以使用;

from itertools import islice

def chunks(data, SIZE=10000):
   it = iter(data)
   for i in range(0, len(data), SIZE):
      yield {k:data[k] for k in islice(it, SIZE)}

示例:

for item in chunks({i:i for i in range(10)}, 3):
   print(item)

具有以下输出。

{0: 0, 1: 1, 2: 2}
{3: 3, 4: 4, 5: 5}
{6: 6, 7: 7, 8: 8}
{9: 9}

答案 4 :(得分:-1)

import numpy as np
chunk_size = 3
chunked_data = [[k, v] for k, v in d.items()]
chunked_data = np.array_split(chunked_data, chunk_size)

此后,您将获得ndarray,该迭代方式如下:

for chunk in chunked_data:
    for key, value in chunk:
        print(key)
        print(value)

可以使用简单的for循环将哪个重新分配给字典列表。