创建和查找每个值具有多个键的 2D 字典

Posted

技术标签:

【中文标题】创建和查找每个值具有多个键的 2D 字典【英文标题】:Create and lookup 2D dictionary with multiple keys per value 【发布时间】:2012-10-30 20:00:22 【问题描述】:

我想我想制作一个每个值有多个键的二维字典。

我知道如何使用defaultdict 制作二维字典:

from collections import defaultdict
2d_dict = defaultdict(dict)

2d_dict['canned_food']['spam'] = 'delicious'

而且我知道使用常规字典可以使用多个键,例如:

dictionary=('food','canned_food'):spam

但我想做一些类似 tuple-of-keys 的查找:

2d_dict[('canned_food','food')]['spam'] = 'delicious'

在字典的第一维中,每个值我需要约 25 个键。有没有办法用defaultdict 做到这一点?

即使有办法用 dicts 来做,这是制作简单多维查找表的合理方法吗?

【问题讨论】:

datascience.stackexchange.com/questions/49529/… 有人可以回答这个问题: 相关:DataScience.SE: How to create dictionary with multiple keys from dataframe in python? (@KHANirfan:你必须显示标题,否则没有人会知道这是一个相关链接,并可能错误地认为你的评论是垃圾邮件) 严格来说,这个问题是在问“创建和查找 2D 字典其键是键元组。这不仅仅是将一个 tuple-of-keys 传递给一个 create 函数,这就是它乍一看的样子...... ...而且你想要 order-independent lookup (好像键是 set/frozenset,而不是元组):twod_dict[('canned_food','food')] 是相反的顺序到您创建的内容。 【参考方案1】:

除了 2d_dict 是一个无效的变量名(它以数字开头)之外,您现有的解决方案已经有效:

>>> from collections import defaultdict
>>> d2_dict = defaultdict(dict)
>>> d2_dict[('canned_food', 'food')]['spam'] = 'delicious'
>>> d2_dict
defaultdict(<type 'dict'>, ('canned_food', 'food'): 'spam': 'delicious')

事实上,您甚至不需要括号 - Python 仍会将您的键识别为元组:

>>> d2_dict['fresh_food', 'food']['eggs'] = 'delicious'
>>> d2_dict
defaultdict(<type 'dict'>, ('canned_food', 'food'): 'spam': 'delicious',
('fresh_food', 'food'): 'eggs': 'delicious')

...而且,是的,这是构建 2D+1D 查找表的一种非常合理的方式。

如果您想使用嵌套字典而不是元组键来构建 3D 查找表,这可行:

>>> d3_dict = defaultdict(lambda: defaultdict(dict))
>>> d3_dict['dried_food']['food']['jerky'] = 'chewy'
>>> d3_dict
defaultdict(<function <lambda> at 0x7f20af38a2a8>, 
'dried_food': defaultdict(<type 'dict'>, 'food': 'jerky': 'chewy'))

【讨论】:

谢谢,我显然已经尝试过这个例子(没有无效的变量名)我一定有错字。你是对的,虽然它确实有效。 如何访问字典。我想:print d2_dict['fresh_food']['eggs'] 会打印出美味,但会出现错误。如果我使用没有列表的字典,它可以正常工作。我必须做一些特别的事情才能访问字典吗? 'fresh_food' 不是***字典中的键 - ('fresh_food', 'food') 是。所以你会使用print d2_dict['fresh_food', 'food']['eggs'] 也许我问错了问题。我希望 'fresh_food' 和/或 'food' 都是单独的键。我不希望整个列表 ['fresh_food','food'] 成为键。 如果你想要一个值的多个键,你需要分别添加它们,作为字典中的两个不同的项目。

以上是关于创建和查找每个值具有多个键的 2D 字典的主要内容,如果未能解决你的问题,请参考以下文章

在字典中查找重复值并打印重复元素的键

在dict中查找给定键的公共值,其中每个值都是一个集合

在 Pandas Dataframe 中查找多个字典键并返回多个匹配值

在具有特定键的特定值的数组中查找对象的索引[重复]

C#如何创建具有多个相同键的字典? [复制]

在字典列表中查找重复值