Python:在列表中拆分dict

时间:2017-11-17 15:46:18

标签: python list dictionary

我想将一个简单的dict转换为d = {0:0, 1:1, 2:2, 3:3}到一个dict列表,每个dict中的元素数量与此相同({1}}。我尝试使用简单的索引,就像我使用列表一样,但它会给我一个[{0:0, 2:2}, {1:1, 3:3}]。这就是我现在所拥有的:

TypeError: unhashable type: 'slice'

请记住,无论如何我都不需要列表。我只需要将我的主要词典分成def dico_chunks(dico, n): if len(dico) < n: n = len(dico) return [dico[i::n] for i in range(n)] 个子词组列表。

2 个答案:

答案 0 :(得分:3)

基于生成器的方法:

def chunk_dict(d, chunk_size):
    r = {}
    for k, v in d.items():
        if len(r) == chunk_size:
            yield r
            r = {}
        r[k] = v
    if r:
        yield r

d = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6}
list(chunk_dict(d, 2))
# [{1: 1, 2: 2}, {3: 3, 4: 4}, {5: 5, 6: 6}]

相同功能的更短且更高性能的版本(使用itertools.islice) 可以在this answer找到。

对于给定数量的尽可能均匀的分布式块(例如,大小为4,4,3,3而不是4,4,4,2),您可以这样做:

chunks = [{} for _ in range(num_chunks)]
for i, k in enumerate(d):
    chunks[i % num_chunks][k] = d[v]

答案 1 :(得分:0)

您可以使用Iterate through pairs of items in a Python list中定义的pairwise函数执行此操作,并将其传递给dict的items()

from itertools import tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

d = {0:0, 1:1, 2:2, 3:3}

list(map(dict,pairwise(d.items())))
# [{0: 0, 1: 1}, {1: 1, 2: 2}, {2: 2, 3: 3}]

如果您想要非重复对,则可以使用zip

items = list(d.items())

list(map(dict, zip(items[::2], items[1::2])))
# [{0: 0, 1: 1}, {2: 2, 3: 3}]

字典从根本上是无序的,所以如果你想要一个特定的订单,你需要使用其他逻辑来指定。