一些条目未添加到词典中

问题描述

我想根据另一个字典的键创建一个字典。 这是我使用的代码

dic2 = {}
dic1 = {'k1':'v1','k2':'v2','k3':'v3'}
for i in dic1.keys():
    for j in dic1.keys():
        print (i,j)
        dic2[i]=j
print (dic2)

输出

k1 k1
k1 k2
k1 k3
k2 k1
k2 k2
k2 k3
k3 k1
k3 k2
k3 k3
{'k1': 'k3','k2': 'k3','k3': 'k3'}

为什么所有条目都未添加到词典中?

为什么没有:

dic2 ={'k1':'k1','k1':'k2','k1':'k3','k2':'k1','k2':'k2','k2':'k3','k3':'k1','k3':'k2','k3':'k3'} 

但是:

dic2 = {'k1': 'k3','k3': 'k3'}  

解决方法

字典必须包含set个唯一键。这是因为键被散列并用于查找值。您可能会受益于将defaultdictlist工厂一起使用,实例化为:defaultdict(list),在这里您可以有一个指向值列表的键。

from collections import defaultdict
dic2 = defaultdict(list)
dic1 = {'k1':'v1','k2':'v2','k3':'v3'}
for i in dic1.keys():
    for j in dic1.keys():
        print (i,j)
        dic2[i].append(j)
print (dic2)

结果:

{'k1': ['k1','k2','k3'],'k2': ['k1','k3': ['k1','k3']}

请注意,当我们调用dic2[i].append(j)时,如果当前键还没有指向要附加项目的列表,则defaultdict会为您创建一个新列表。

如果您不想使用defaultdict,则可以使用dictionary comprehension

{k: [kk for kk in dic1.keys()] for k in dic1.keys()}
,

字典键必须唯一。例如,您不能有两个“ k1”键。 对于您而言,每个键都保留您最后分配给它的值。