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

bad*_*0re 16 python dictionary python-2.7

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

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

没有使用外部模块(numpy等)你有什么想法吗?

the*_*eye 42

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

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)}
Run Code Online (Sandbox Code Playgroud)

样品运行:

for item in chunks({i:i for i in xrange(10)}, 3):
    print item
Run Code Online (Sandbox Code Playgroud)

产量

{0: 0, 1: 1, 2: 2}
{3: 3, 4: 4, 5: 5}
{8: 8, 6: 6, 7: 7}
{9: 9}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.在Python3中使用`range()`而不是`xrange()` (7认同)

小智 7

对于 Python 3+。

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

您可以使用;

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)}
Run Code Online (Sandbox Code Playgroud)

样本:

for item in chunks({i:i for i in range(10)}, 3):
   print(item)
Run Code Online (Sandbox Code Playgroud)

具有以下输出。

{0: 0, 1: 1, 2: 2}
{3: 3, 4: 4, 5: 5}
{6: 6, 7: 7, 8: 8}
{9: 9}
Run Code Online (Sandbox Code Playgroud)


ndp*_*dpu 5

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

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

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

>>> 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}]
Run Code Online (Sandbox Code Playgroud)