首页 > 解决方案 > 试图写入字典中的特定键,但它正在写入整个字典中的所有键

问题描述

我正在尝试从字符列表中计算许多不同的变量,并将它们放入嵌套字典中。但是,由于特定任务,彼此“相邻”的字典都具有相同的键,如下图 dataDict 所示。我正在尝试计算具有特定值的事物,因此每当我尝试将键的值加 1 时,字典中所有具有该键的项目的值都会加 1,而不仅仅是我想要添加的一项1到。我想知道是否有办法阻止这种情况发生,或者是否有更好的方法来做我想做的事情。键必须相同,因为整个字典的一般形状是:

{'a':{1:{'a':0, 'b':0, 'c':0 , ...}, 2 :{'a':0, ...}, ...}, 'b':{...}}

下面的代码旨在显示正在发生的事情,实际上访问 dataDict 的所有键都是变量,但它们都可以正常工作。

我看过使用计数器,但据我所知,我遇到了同样的问题。

dataDict = {'G':{1:{'a':0}, 2:{'a':0}, 3:{'a':0}}, 'L':{1:{'a':0}, 2:{'a':0}, 3:{'a':0}}}

characters = ["l", "i", "s", "t", " ", "o", "f", " ", "c", "h", "a", "r", "a", "c", "t", "e", "r", "s"]

for i in string:
    if tweet.index(i) > 2:
        dataDict['G'][1]['a'] += 1  

预期的:

dataDict = {'G':{1:{'a':15}, 2:{'a':0}, 3:{'a':0}}, 'L':{1:{'a':0}, 2:{'a':0}, 3:{'a':0}}}

实际的:

dataDict = {'G':{1:{'a':15}, 2:{'a':15}, 3:{'a':15}, 'L':{1:{'a':15}, 2:{'a':15}, 3:{'a':15}}}

制作 dataDict 的代码是:

from collections import defaultdict, Counter

def makeDict():
    string = """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890().,:;'" []//|\\!@#$%^&*_+-=<>?~`"""

    overall = defaultdict(Counter)
    dictionary = {}

    listofstuff = list(string)

    for i in listofstuff:
        dictionary[str(i)] = 0

    for a in listofstuff:
        overall[str(a)] = {1 : dictionary, 2 : dictionary, 3 : dictionary}

    return overall

标签: pythondictionary

解决方案


字典是 Python 中的引用类型。这取决于你是如何在dataDict这里形成的。我认为您在许多地方使用/分配相同的变量,所有这些都指向相同的内存位置。

所以更新其中任何一个就像反映其他人的价值观一样。

为了快速理解,请查看以下在终端上执行的 3 个代码片段。

问题

>>> d = {"a": 0}
>>> 
>>> data = {1: d, 2: d, 3: d}
>>> 
>>> data
{1: {'a': 0}, 2: {'a': 0}, 3: {'a': 0}}
>>> 
>>> data[1]['a'] += 1
>>> 
>>> data
{1: {'a': 1}, 2: {'a': 1}, 3: {'a': 1}}
>>> 

解决方案 1

>>> # 1st way
... 
>>> data = {1: {**d}, 2: {**d}, 3: {**d}}
>>> data
{1: {'a': 1}, 2: {'a': 1}, 3: {'a': 1}}
>>> 
>>> data[1]['a'] += 1
>>> 
>>> data
{1: {'a': 2}, 2: {'a': 1}, 3: {'a': 1}}
>>> 
>>> 

解决方案 2(使用 deepcopy)

>>> # 2nd way
...
>>> from copy import deepcopy
>>> 
>>> d
{'a': 1}
>>> 
>>> data = {1: deepcopy(d), 2: deepcopy(d), 3: deepcopy(d)}
>>> data
{1: {'a': 1}, 2: {'a': 1}, 3: {'a': 1}}
>>> 
>>> data[1]['a'] += 1
>>> data
{1: {'a': 2}, 2: {'a': 1}, 3: {'a': 1}}
>>>

推荐阅读