Python中有'multimap'实现吗?

89 投票
7 回答
50849 浏览
提问于 2025-04-15 15:59

我刚开始学习Python,对其他语言中的多重映射的实现有一些了解。请问Python有没有内置的这种数据结构,或者在常用的库中可以找到?

为了更好地说明我所说的“多重映射”:

a = multidict()
a[1] = 'a'
a[1] = 'b'
a[2] = 'c'

print(a[1])  # prints: ['a', 'b']
print(a[2])  # prints: ['c']

7 个回答

5

你可以把一组元组放在一起,然后像处理多重映射一样对它们进行排序。

listAsMultimap=[]

现在我们来添加一些元素(元组):

listAsMultimap.append((1,'a'))
listAsMultimap.append((2,'c'))
listAsMultimap.append((3,'d'))
listAsMultimap.append((2,'b'))
listAsMultimap.append((5,'e'))
listAsMultimap.append((4,'d'))

接下来对它进行排序。

listAsMultimap=sorted(listAsMultimap)

打印出来后,你会得到:

[(1, 'a'), (2, 'b'), (2, 'c'), (3, 'd'), (4, 'd'), (5, 'e')]

这就说明它像一个多重映射一样在工作!

请注意,如果键相同,这里的值也是按升序排列的(比如对于键=2,'b' 在 'c' 之前,尽管我们添加它们的顺序不是这样)。

如果你想让它们按降序排列,只需像这样修改 sorted() 函数:

listAsMultimap=sorted(listAsMultimap,reverse=True)

然后你会得到这样的输出:

[(5, 'e'), (4, 'd'), (3, 'd'), (2, 'c'), (2, 'b'), (1, 'a')]

同样地,这里的值在键相同的情况下是按降序排列的。

9

为了方便未来的访问者。目前有一个用Python实现的Multimap(多重映射)。你可以通过pypi找到它。

147

这种功能在标准库中是没有的。不过你可以使用一个叫做 defaultdict 的东西:

>>> from collections import defaultdict
>>> md = defaultdict(list)
>>> md[1].append('a')
>>> md[1].append('b')
>>> md[2].append('c')
>>> md[1]
['a', 'b']
>>> md[2]
['c']

(如果你想用 set 而不是 list,那么你应该用 .add 而不是 .append。)


顺便提一下:看看你写的这两行:

a[1] = 'a'
a[1] = 'b'

这似乎表明你想让表达式 a[1] 等于两个不同的值。但在字典中这是不可能的,因为字典的键是唯一的,每个键只能对应一个值。不过,你可以做的是,逐个提取与某个键相关联的列表中的所有值。你可以使用 iter,然后连续调用 next 来实现这个功能。或者你也可以使用两个循环:

>>> for k, v in md.items():
...     for w in v:
...         print("md[%d] = '%s'" % (k, w))
... 
md[1] = 'a'
md[1] = 'b'
md[2] = 'c'

撰写回答