如何为内部字典键创建新列表或设置对象,以便不重复更新同一对象?

Posted

技术标签:

【中文标题】如何为内部字典键创建新列表或设置对象,以便不重复更新同一对象?【英文标题】:How to create a new list or set object for an inner dictionary key so that the same object is not repeatedly being updated? 【发布时间】:2021-12-24 07:05:52 【问题描述】:

我正在尝试创建一个内部字典,其值存储在列表或集合对象中(在本示例中使用集合)。

t = [('Jobs', set()), ('Titles', set())]
inn_d = lambda: dict(t)

并创建一个默认字典并将inn_d 传递到其中。

d = defaultdict(inn_d)

在为d 和外部键创建条目时,每个内部键的两个值都会更新。

d['A']['Jobs'].add('Cook')
d['B']['Titles'].add('President')
d
defaultdict(<function <lambda> at 0x0000016691157DC0>, 'A': 'Jobs': 'Cook', 'Titles': 'President', 'B': 'Jobs': 'Cook', 'Titles': 'President')

应该是什么时候

defaultdict(<function <lambda> at 0x0000016691157DC0>, 'A': 'Jobs': 'Cook', 'Titles': set(), 'B': 'Jobs': set(), 'Titles': 'President')

我知道 JobsTitles 的同一个集合对象被调用 - 我不确定在创建内部字典时如何创建新的集合对象。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

每次都像这样创建一个新的:

def inn_d():
    return 'Jobs': set(), 'Titles': set()

顺便说一句,named lambdas are bad practice。

【讨论】:

看起来我得到了相同的结果。这是解决这个问题的正确方法吗? inner = inn_d()d = defaultdict(lambda: inner) @user2059363 不,d = defaultdict(inn_d)。您也可以查看my full test code。 啊,我明白了。非常感谢。我的理解是否正确,通过不包括 d = defaultdict(inn_d) 中的括号,我们使 inn_d 可调用而不是返回字典,每次调用它都会返回一个新对象? @user2059363 np!我不确定你在问什么。 inn_d 已经是可调用的,因为它是一个函数,并且 dicts 是不可调用的。 @user2059363 inn_d() 每次都会返回一个新的字典,但如果你像使用inner = inn_d() 一样捕获它的返回值,lambda: inner 将始终返回相同的字典。

以上是关于如何为内部字典键创建新列表或设置对象,以便不重复更新同一对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 AWS RDS 实例设置数据库时区 [重复]

ASP.NET Razor - 如何为对象列表创建 POST 表单?

JavaScript数据结构与算法 - 散列表

在字典列表中查找重复值

字典列表中的切片[重复]

Python字典创建、基本操作以及常用方法