我有以下格式的字典:
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}
非常感谢
答案 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()))
。