python - 试图写入字典中的特定键,但它正在写入整个字典中的所有键
问题描述
我正在尝试从字符列表中计算许多不同的变量,并将它们放入嵌套字典中。但是,由于特定任务,彼此“相邻”的字典都具有相同的键,如下图 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
解决方案
字典是 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}}
>>>
推荐阅读
- reactjs - React.js:有没有一种更简单的方法可以将表单输入元素定义为最佳实践?不使用其他库或扩展
- excel - 使用 VBA 从网页“POP UP”表中捕获数据
- git - 在当前分支中修改提交时同步其他分支
- java - 在 onCharacteristicRead() Android Java BLE 中更新 GUI
- javascript - Discord.js 对于每个用户
- amazon-web-services - 如何限制 AWS Cognito 用户采取某些行动?
- python - 如何在 Flask-SQLAlchemy 中启用连接池?
- c - 我们正在尝试存储通过我们的 readPoly 函数输入的多个数组
- python - 如何在 Pandas 中检查时间范围?
- blazor - Blazor 可以在没有任何 UI 引用或代码的情况下创建 wasm 模块吗?