迭代地将int列表输入到list字典中

问题描述 投票:0回答:3

我有这个代码:

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

python list dictionary
3个回答
1
投票

因此,如果您知道

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)

0
投票

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)}

0
投票

使用循环并对列表进行切片。词典已就地更新。

n = 0
for k, l in test_dict.items():
    test_dict[k] = lis[n:n+len(l)]
    n += len(l)
© www.soinside.com 2019 - 2024. All rights reserved.