我有这个代码:
test_dict = {'aaa' : [1, 2], 'bbb' : [4, 5], 'ccc' : [7, 8]}
lis = [11, 22, 44, 55, 77, 88]
我正在尝试迭代更新
test_dict
成为:
test_dict = {'aaa' : [11, 22], 'bbb' : [44, 55], 'ccc' : [77, 88]}
我最接近找到解决方案的是: https://www.geeksforgeeks.org/python-iterate-through-value-lists-dictionary/ (方法#1) 但我不确定在哪里分解
res
变量的右侧来更新 test_dict
。
因此,如果您知道
lis
始终至少具有需要替换的值,并且字典中列表的大小是任意的,那么您可以使用以下内容:
import itertools
test_dict = {'aaa' : [1, 2], 'bbb' : [4, 5], 'ccc' : [7, 8]}
lis = [11, 22, 44, 55, 77, 88]
iterator = iter(lis)
for vs in test_dict.values():
vs[:] = itertools.islice(iterator, len(vs))
print(test_dict)
如果
lis
可能更小,那么您可以采取一些措施来达到以下效果:
iterator = iter(lis)
for vs in test_dict.values():
for i, e in enumerate(vs):
try:
vs[i] = next(iterator)
except StopIteration:
# you could do something with e perhaps if you wanted
pass
这只会替换
lis
中的尽可能多的值。您可以根据需要处理 except
子句,在这种情况下,它只是保留已有的内容(不执行任何操作),但您可以添加一个虚拟值或任何您想要的值。
以上内容改变了原始字典。如果您想创建一个单独的新词典,可以按以下方式修改方法:
# we know lis has at least as many items as needed to replace
iterator = iter(lis)
new_dict = {k : list(itertools.islice(iterator, len(vs))) for k, vs in test_dict.items()}
或者,如果
lis
的物品可能少于需要更换的物品:
iterator = iter(lis)
new_dict = {}
for k, vs in test_dict.items():
new_dict[k] = sublist = []
for i, e in enumerate(vs):
try:
sublist.append(next(iterator))
except StopIteration:
sublist.append(e)
Python 3.12 引入了一个函数,可以让您组合相邻的列表条目。将其与
zip
函数和字典理解相结合,可以为您提供一种优雅的方式来完成您所描述的事情。
from itertools import batched
batched_lis = [list(sublist) for sublist in batched(lis, 2)]
test_dict = {key: value for key, value in zip(sorted(test_dict), batched_lis)}
使用循环并对列表进行切片。词典已就地更新。
n = 0
for k, l in test_dict.items():
test_dict[k] = lis[n:n+len(l)]
n += len(l)