稍微修改复制的dict



我有一个以下格式的dict:

d = {'K1': [1, 2, 3], 'K2': [4, 5, 6], 'K3': [7, 8, 9]}

我想要这个dict的N个修改副本,其中第N个dict ONLY将列表中的第N个元素作为值。

我在stackoverflow上发现了这个有用且强大的语法:

new_dict = {**old_dict, 'changed_val': value, **other_new_vals_as_dict}

输出应该是这样的(一个包含N个dict的列表(,其中第N个dict是这样的:

nth_dict={"K1":vn}

提前感谢

您链接到的代码将不起作用。如果你花几秒钟的时间尝试一下,你会发现语法只用于修改字典中的键——你可以添加键或覆盖键。您要做的是修改每个字典中的键值。有几种方法可以做到这一点,在这个简单的示例字典中进行了演示:

>>> d = {'a':[1,2,3], 'b':[4, 5, 6]}
>>> d
{'a': [1, 2, 3], 'b': [4, 5, 6]}

最简单的方法是对每个索引使用列表理解,并结合字典理解每次重新创建dict。如果你不熟悉列表理解,谷歌一下,它们是python的重要组成部分。

>>> [{k:l[i] for k, l in d.items()} for i in range(3)]
[{'a': 1, 'b': 4}, {'a': 2, 'b': 5}, {'a': 3, 'b': 6}]

您还可以使用zip和元组拆包的组合

>>> [dict(zip(d.keys(), v)) for v in zip(*d.values())]
[{'a': 1, 'b': 4}, {'a': 2, 'b': 5}, {'a': 3, 'b': 6}]

您可以将列表理解与嵌套字典理解一起使用:

>>> d = {"K1": ["v1","v2","v3"], "K2": ["w1","w2","w3"]}
>>> [{k: v[i] for k, v in d.items()} for i in range(min(map(len, d.values())))]
[{'K1': 'v1', 'K2': 'w1'},
{'K1': 'v2', 'K2': 'w2'},
{'K1': 'v3', 'K2': 'w3'}]

如果值仍应为列表,则将它们包装到[...]:中

>>> [{k: [v[i]] for k, v in d.items()} for i in range(min(map(len, d.values())))]
[{'K1': ['v1'], 'K2': ['w1']},
{'K1': ['v2'], 'K2': ['w2']},
{'K1': ['v3'], 'K2': ['w3']}]

当然,如果您知道列表中元素的数量,则可以仅用该数量替换min(map(len, d.values()))

最新更新