python - 多值 Python 字典的插入问题
问题描述
我是 Python 新手,所以请放轻松。我正在使用字典为一个键存储多个值,但是,当我尝试更新值时遇到问题。这是我设置字典的方法;首先,我使用以下方法编写第一个值setdefault()
:
dictionary.setdefault(id.ID, []).append(id.enterTime)
dictionary.setdefault(id.ID, []).append(id.duration)
dictionary.setdefault(id.ID, []).append(id.enter)
dictionary.setdefault(id.ID, []).append(id.exit)
dictionary.setdefault(id.ID, []).append(id.standing)
dictionary.setdefault(id.ID, []).append(id.sitting)
为了解释起见,假设它在打印时产生以下输出:
{0: [5, 120, 0, 0, 0, 0]}
当 id.enter 实例变量更改时,我使用以下代码更新字典,只需删除原始值并将新值附加到字典:
dictionary[id.ID].remove(id.enter)
dictionary[id.ID].insert(2, id.enter)
字典打印如下:
{0: [5, 120, 1, 0, 0, 0]}
稍后在程序中,实例变量 id.exit 变为 1。我尝试在字典中将退出值从 0 更新为 1 后更改,如下所示:
dictionary[id.ID].remove(id.exit)
dictionary[id.ID].insert(3, id.exit)
我知道,这样做的方法非常糟糕,但我认为这是更新值的最简单方法。当我这样做时,会出现问题,因为它会更改id.enter
回其原始值但会更新id.exit
:
{0: [5, 120, 0, 1, 0, 0]}
有谁知道为什么会发生这种情况?谢谢。
解决方案
use @mkrieger1 的答案解释了您的代码的问题/错误并提供了快速解决方案。
存储数据的另一种方法可能是使用嵌套的 dicts 使其更清晰且不易出错:
my_dict = {
id.ID: {
'enterTime': id.enterTime,
'duration': id.duration,
'enter': id.enter,
'exit': id.exit,
'standing': id.standing,
'sitting': id.sitting,
}
}
或者甚至更好defaultdict
:
import collections
my_dict = collections.defaultdict(lambda: {
'enterTime': 0,
'duration': 0,
'enter': 0,
'exit': 0,
'standing': 0,
'sitting': 0,
})
print(my_dict)
# defaultdict(<function <lambda> at 0x7f327d094ae8>, {})
# add a new ID, it creates the nested dict automatically
my_dict[object_1.ID]['exit'] = object_1.exit
print(my_dict)
# defaultdict(<function <lambda> at 0x7f327d094ae8>, {1: {'enterTime': 0, 'duration': 0, 'enter': 0, 'exit': 5, 'standing': 0, 'sitting': 0}})
推荐阅读
- c++ - 使用 extern 关键字时 QT 程序崩溃
- python - 否则,Python -
- reactjs - 修复错误:动作必须是普通对象。相反,实际类型是:“未定义”。您可能需要将中间件添加到您的商店设置中
- c# - Blazor 中带有主题和正文的 Mailto
- unit-testing - 当我可以使用 Postman 和调试器检查我的代码时,为什么还要编写单元测试?
- github - GitHub 上的 Git LFS:在 1GB 免费限制内滚动文件跟踪?
- hazelcast - Hazekcast 4:大炮进行远程调用:com.hazelcast.map.impl.operation.EntryOperation
- java - 当使用 @Transactional 注释方法时究竟会发生什么?创建代理需要什么?
- python - 如何从 python 项目创建 Linux 包安装程序?
- c# - 使用 Cocoa 的 Visual Studio 中的错误消息