Python中有“multimap”实现吗?

2024-09-28 17:23:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,熟悉otherlanguagesMultimaps的实现。Python是否内置了这样的数据结构,或者在常用的库中可用?

为了说明我所说的“多重映射”是什么意思:

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

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

Tags: 数据结构prints内置print新手multidictotherlanguagesmultimaps
3条回答

Stephan202有正确的答案,使用defaultdict。但是如果你想用C++的STL多功能接口和更糟糕的性能来做一些事情,你可以这样做:

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的强大功能,您应该使用它。

这样的东西在标准库中是不存在的。您可以使用^{}尽管:

>>> 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]等于两个不同的值。这在字典中是不可能的,因为它们的键是唯一的,并且每个键都与一个值相关联。但是,可以做的是逐个提取与给定键相关联的列表中的所有值。您可以使用^{}和对^{}的连续调用。也可以只使用两个循环:

>>> 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实现。可通过pypi获得

相关问题 更多 >