Python中的二维关联数组

6 投票
3 回答
11475 浏览
提问于 2025-04-16 21:32

我有一个集合,里面有一些元素,比如'A'、'B'、'C'。我想创建一个二维的关联数组,这样我就可以像这样操作:d['A']['B'] += 1。我在想用字典里面再嵌套一个字典,这样做可以吗?有没有更好的方法?

3 个回答

4

一种方法是使用字典的字典。

另一种选择是直接使用元组:

d[('A','B')] += 1

正如TokenMacGuy所提到的,括号其实是可选的:

d['A','B'] += 1

根据你的代码,这样做可能会让事情变得简单一些。

14

这里有两个明显的解决办法:第一种是使用 defaultdict,这样可以自动在一个字典里嵌套另一个字典。

>>> d = collections.defaultdict(dict)
>>> d['a']['b'] = 'abc'
>>> d
defaultdict(<type 'dict'>, {'a': {'b': 'abc'}})
>>> 

第二种方法是直接用 元组 来作为字典的键:

>>> d = {}
>>> d['a','b'] = 'abc'
>>> d
{('a', 'b'): 'abc'}
>>> 

如果你想要 += 的效果,可以把上面的字典换成 defaultdict(int)

>>> d = collections.defaultdict(lambda:collections.defaultdict(int))
>>> d['a']['b'] += 1
>>> d
defaultdict(<function <lambda> at 0x18d31b8>, {'a': defaultdict(<type 'int'>, {'b': 1})})
>>> 
>>> d = collections.defaultdict(int)
>>> d['a','b'] += 1
>>> d
defaultdict(<type 'int'>, {('a', 'b'): 1})
>>> 
3

有没有什么理由不使用字典的字典呢?毕竟它能满足你的需求(不过要注意,Python里没有像 ++ 这样的操作符)。

使用字典的字典在风格上并没有什么问题,也不算不符合Python的风格。

撰写回答