标准库中没有这样的东西。 但是您可以使用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'
仅供未来访客参考。目前已有 Python 实现的 Multimap。可通过pypi 获取。
defaultdict(set)
有何不同? - Shuklaswagitems()
不会返回所有的项(每个唯一键只返回一个随机值),而且删除一个键基本上会重写整个字典,所以时间复杂度是O(n)。我认为这不是生产级别的代码。 - undefinedlistAsMultimap=[]
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')]
这意味着它正像Multimap一样工作!
请注意,就像Multimap一样,如果键相同,值也会按升序排序(对于key=2,'b'在'c'之前,尽管我们没有按此顺序追加它们。)
如果您想按降序获取它们,请将sorted()函数更改为以下内容:
listAsMultimap=sorted(listAsMultimap,reverse=True)
在完成后,您将得到类似以下的输出:
[(5, 'e'), (4, 'd'), (3, 'd'), (2, 'c'), (2, 'b'), (1, 'a')]
如果键相同,此处的值是按降序排列的。
用Python编写这个的标准方法是使用一个字典,其元素分别为list
或set
。正如stephan202所说,你可以使用defaultdict来自动化这一过程,但并非必须。
换句话说,我会将您的代码翻译为:
a = dict()
a[1] = ['a', 'b']
a[2] = ['c']
print(a[1]) # prints: ['a', 'b']
print(a[2]) # prints: ['c']
a[1] = 'b'
视为追加而不是替换a[1]
,这样做更令人困惑而不是有帮助。 - poolieStephan202给出了正确的答案,使用defaultdict
。但是如果你想要一个类似于C++ STL multimap接口但性能更差的东西,你可以这样做:
multimap = []
multimap.append( (3,'a') )
multimap.append( (2,'x') )
multimap.append( (3,'b') )
multimap.sort()
现在,当您遍历multimap
时,您将获得与std::multimap
中一样的键值对。不幸的是,这意味着您的循环代码将开始变得像C++一样丑陋。
def multimap_iter(multimap,minkey,maxkey=None):
maxkey = minkey if (maxkey is None) else maxkey
for k,v in multimap:
if k<minkey: continue
if k>maxkey: break
yield k,v
# this will print 'a','b'
for k,v in multimap_iter(multimap,3,3):
print v
defaultdict
非常酷,充分利用了Python的强大功能,你应该使用它。或者继承 dict
:
class Multimap(dict):
def __setitem__(self, key, value):
if key not in self:
dict.__setitem__(self, key, [value]) # call super method to avoid recursion
else
self[key].append(value)
a[1] = 'b'
表示向a[1]追加内容会让阅读或维护代码的人感到困惑。我建议你不要这样做。 - poolie