【问题标题】:Some entries not added in a dictionary [duplicate]字典中未添加的某些条目[重复]
【发布时间】:2020-12-01 08:29:28
【问题描述】:

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

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', 'k2': 'k3', 'k3': 'k3'}  

【问题讨论】:

  • 字典必须包含一个 set 的唯一键。这是因为键被散列并用于查找值。您可能会受益于使用defaultdict(list),您可以在其中拥有一个指向值列表的键。
  • @patalvali,因为 JacobIRR 键是唯一的,所以您看到的是分配给每个键的最后一个值。
  • 除了你的脚本,试着输入dic2 ={'k1':'k1','k1':'k2','k1':'k3','k2':'k1','k2':'k2','k2':'k3','k3':'k1','k3':'k2','k3':'k3'},然后输入print(dic2),看看你会得到什么......
  • 感谢您的 cmets。说得通。一件事我还是不明白。为什么保留最新的条目?保留第一个似乎更合乎逻辑(因为其他可能被视为重复键)。不 ?另一点:这个问题可能与另一个问题重复,但肯定不会与提到的问题重复。 (2个非常不同的问题恕我直言)

标签: python dictionary


【解决方案1】:

字典必须包含一个 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', 'k2', 'k3'],
 'k3': ['k1', 'k2', 'k3']}

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

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

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

【讨论】:

    【解决方案2】:

    字典键必须是唯一的。例如,您不能有两个“k1”键。 在您的情况下,每个键都会保留您最后分配给它的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多