代码之家  ›  专栏  ›  技术社区  ›  Dean Christian Armada

把一本大字典分成一个小字典

  •  -1
  • Dean Christian Armada  · 技术社区  · 7 年前

    假设我有一本字典,有1000个键值

    x = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', ....}
    

    我想把它换成

    x = [{1: 'a', 2: 'b', 3: 'c', ...}, {10: 'z', 11: 'z', 12: 'z', ...}]
    

    我想知道python是否有这个内置函数。另外,我关心的是缩放……假设我在一本字典上有一百万个键值,那么我希望通过列表中的1000个键值来分隔它。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Andrej Kesely    7 年前

    # create some dictionary
    x = {i: 'z' + str(i) for i in range(1, 22+1)}
    
    def get_chunks(x, size=10):
        out = {}
        for i, k in enumerate(x, 1):
            if i % size == 0:
                yield out
                out = {}
            out[k] = x[k]
        # last chunk:
        if out:
            yield out
    
    for chunk in get_chunks(x):
        print(chunk)
    

    {1: 'z1', 2: 'z2', 3: 'z3', 4: 'z4', 5: 'z5', 6: 'z6', 7: 'z7', 8: 'z8', 9: 'z9'}
    {10: 'z10', 11: 'z11', 12: 'z12', 13: 'z13', 14: 'z14', 15: 'z15', 16: 'z16', 17: 'z17', 18: 'z18', 19: 'z19'}
    {20: 'z20', 21: 'z21', 22: 'z22'}
    

    print(list(get_chunks(x)))
    
        2
  •  3
  •   blhsing    7 年前

    itertools 10

    list(map(dict, zip(*[iter(x.items())] * 10)))
    
        3
  •  1
  •   Boris Lipschitz    7 年前

    对于你的问题,一个直截了当、极其难看的答案是这样的:

    import itertools
    
    def slice_it_up(d, n):
        return [{x for x in itertools.islice(d.items(), i, i+n)} for i in range(0, len(d), n)]
    
    d = {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5}
    dd = slice_it_up(d, 3)
    
    print(dd)
    

    [{('key2', 2), ('key1', 1), ('key3', 3)}, {('key5', 5), ('key4', 4)}]