如何为内部字典键创建新列表或设置对象,以便不重复更新同一对象?
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')
我知道 Jobs
和 Titles
的同一个集合对象被调用 - 我不确定在创建内部字典时如何创建新的集合对象。
感谢您的帮助。
【问题讨论】:
【参考方案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
将始终返回相同的字典。以上是关于如何为内部字典键创建新列表或设置对象,以便不重复更新同一对象?的主要内容,如果未能解决你的问题,请参考以下文章