我想将一个简单的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)]
个子词组列表。
答案 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}]
字典从根本上是无序的,所以如果你想要一个特定的订单,你需要使用其他逻辑来指定。