多值 Python 字典的插入问题
Insertion Problem with Multiple-Value Python Dictionary
我是 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]}
有谁知道为什么会这样?谢谢。
如 tutorial 中所述:
list.remove(x)
Remove the first item from the list whose value is equal to x. It raises a ValueError if there is no such item.
所以如果你有列表
[5, 120, 1, 0, 0, 0]
并使用remove(id.exit)
,当id.exit
等于1时,则列表变为:
[5, 120, 0, 0, 0]
作为一个简单的解决方案,而不是
dictionary[id.ID].remove(id.exit)
dictionary[id.ID].insert(3, id.exit)
就用
dictionary[id.ID][3] = id.exit
use @mkrieger1 的回答用你的代码解释了 problem/error 并给出了一个快速的解决方案。
另一种存储数据的方法可能是使用嵌套的字典来使其更清晰、更少error-prone:
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}})
我是 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]}
有谁知道为什么会这样?谢谢。
如 tutorial 中所述:
list.remove(x)
Remove the first item from the list whose value is equal to x. It raises a ValueError if there is no such item.
所以如果你有列表
[5, 120, 1, 0, 0, 0]
并使用remove(id.exit)
,当id.exit
等于1时,则列表变为:
[5, 120, 0, 0, 0]
作为一个简单的解决方案,而不是
dictionary[id.ID].remove(id.exit)
dictionary[id.ID].insert(3, id.exit)
就用
dictionary[id.ID][3] = id.exit
use @mkrieger1 的回答用你的代码解释了 problem/error 并给出了一个快速的解决方案。
另一种存储数据的方法可能是使用嵌套的字典来使其更清晰、更少error-prone:
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}})