Python拆分一个字典为列表

2024-03-28 21:59:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一个简单的dict转换成一个dict列表,其中每个dict中的元素数量与这个相同:[{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)]

请记住,无论如何,我不需要把清单整理好。我只需要把我的主字典分成n个子字典的列表。在


Tags: 元素列表数量lenif字典deftype
2条回答

您可以使用在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

^{pr2}$

字典基本上是无序的,所以如果您想要一个特定的顺序,您需要使用其他一些逻辑来指定它。在

基于发电机的方法:

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),您可以:

^{pr2}$

相关问题 更多 >