稍微修改复制的字典

时间:2018-10-31 13:30:43

标签: python python-3.x

我有以下格式的字典:

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

我想拥有该字典的N个修改副本,其中第n个字典仅将列表的第n个元素作为值。

我发现this在stackoverflow上有用而强大的语法:

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

输出应如下所示(包含N个字典的列表),其中第n个字典如下所示:

nth_dict = {“ K1”:vn}

非常感谢

2 个答案:

答案 0 :(得分:2)

您链接到的代码无效。 如果花几秒钟尝试一下,您会发现该语法仅用于修改字典中的键-您可以添加键或覆盖键。 您要做的是修改每个词典中的键值。 您可以通过以下几种简单的示例字典中展示的几种方法进行操作:

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

最直接的方法是对每个索引使用列表推导,再与字典推导结合使用,以每次重新创建字典。 如果您不熟悉Google的列表推导,它们是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}]

答案 1 :(得分:0)

您可以将列表理解与嵌套的字典理解结合使用:

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