Python中有'multimap'实现吗?
我刚开始学习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'