【问题标题】:Adding dictonary with static keys inside another dictonary in python 3在python 3中的另一个字典中添加带有静态键的字典
【发布时间】:2020-05-30 00:31:44
【问题描述】:

我想用另一个具有固定键的词典制作一个词典,例如

dic1 = {'filename':'file1','namelen':'5'}
dic2 = {
"file1":dic1,
"file2":dic2,
...
...
}

我的代码的问题是添加一个新的字典会覆盖所有现有的内部字典。

dic1 ={}
dic2 ={}
file_list = ["file1","file2", "file3"]
for file in file_list:
 dic1["filename"] = file
 dic1["namelen"] = len(file)
 dic2[file] = dic1
print(dic2)

我的字典是这样的

    dic2 = 
{
'file1': {'namelen': 5, 'filename': 'file3'}, 
'file3': {'namelen': 5, 'filename': 'file3'}, 
'file2': {'namelen': 5, 'filename': 'file3'}
} 

如何在不切换到列表的情况下防止覆盖?

【问题讨论】:

  • dic1 ={}移动到你的for loop
  • dic2 不是有效的 Python,因为它代表一个带有字典的集合(不可散列)
  • @DaniMesejo,我已在第一个描述中更正。对不起!

标签: python python-3.x dictionary overwrite


【解决方案1】:

您可以在 for 中使用一行 python 代码来实现您的结果。

dic ={}
file_list = ["file1","file2", "file3"]
for file in file_list:
    dic[file] = { "filename": file, "namelen": len(file) }
print(dic)

输出

{
   'file1': {'filename': 'file1', 'namelen': 5}, 
   'file2': {'filename': 'file2', 'namelen': 5}, 
   'file3': {'filename': 'file3', 'namelen': 5}
}

【讨论】:

    【解决方案2】:

    这可能有用。

    dic2 = dict()
    file_list = ["file1", "file2", "file3"]
    for file_name in file_list:
        dic1 = dict()
        dic1["filename"] = file_name
        dic1["namelen"] = len(file_name)
        dic2[file_name] = dic1
    print(dic2)
    

    输出:

    {
         'file1': {'filename': 'file1', 'namelen': 5},
         'file2': {'filename': 'file2', 'namelen': 5},
         'file3': {'filename': 'file3', 'namelen': 5}
    }
    

    【讨论】:

      【解决方案3】:

      试试这个方法:

      dic2 ={}
      file_list = ["file1","file2", "file3"]
      for f in file_list:
       dic1 ={}
      
       dic1["filename"] = f
       dic1["namelen"] = len(f)
       dic2[f] = dic1
      print(dic2)
      

      每次迭代都尝试在循环内创建一个新的dict1={}

      否则,如果你在循环之外做,它会一次又一次地引用同一个字典

      【讨论】:

        【解决方案4】:

        添加字典副本而不是字典本身。

        这一行:

        dic2[file] = dic1
        

        更改为:

        dic2[file] = dic1.copy()
        

        【讨论】:

        • 是的,这行得通!谢谢。因此,在执行 dic2[file] = dic1 时,不要复制数据,而只复制对象的引用。对于所有嵌入式字典,dic1 的最后一个值将存在于 dic2 中!
        • 是的,dic2[file] = dic1 正在添加引用(如指针)。当指向它的值发生变化时,所有引用都会更新。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 2019-02-08
        • 2022-07-10
        • 2022-06-23
        • 1970-01-01
        • 2018-09-22
        相关资源
        最近更新 更多