2024-09-28 17:23:07 发布
网友
我是Python新手,熟悉otherlanguages中Multimaps的实现。Python是否内置了这样的数据结构,或者在常用的库中可用?
为了说明我所说的“多重映射”是什么意思:
a = multidict() a[1] = 'a' a[1] = 'b' a[2] = 'c' print(a[1]) # prints: ['a', 'b'] print(a[2]) # prints: ['c']
Stephan202有正确的答案,使用defaultdict。但是如果你想用C++的STL多功能接口和更糟糕的性能来做一些事情,你可以这样做:
defaultdict
multimap = [] multimap.append( (3,'a') ) multimap.append( (2,'x') ) multimap.append( (3,'b') ) multimap.sort()
现在,当您遍历multimap时,将得到与在std::multimap中一样的对。不幸的是,这意味着你的循环代码会变得和C++一样丑陋。
multimap
std::multimap
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。)
set
list
.add
.append
作为旁白:看看你写的这两行:
a[1] = 'a' a[1] = 'b'
这似乎表明您希望表达式a[1]等于两个不同的值。这在字典中是不可能的,因为它们的键是唯一的,并且每个键都与一个值相关联。但是,可以做的是逐个提取与给定键相关联的列表中的所有值。您可以使用^{}和对^{}的连续调用。也可以只使用两个循环:
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获得
Stephan202有正确的答案,使用
defaultdict
。但是如果你想用C++的STL多功能接口和更糟糕的性能来做一些事情,你可以这样做:现在,当您遍历
multimap
时,将得到与在std::multimap
中一样的对。不幸的是,这意味着你的循环代码会变得和C++一样丑陋。总之,
defaultdict
非常酷,利用了python的强大功能,您应该使用它。这样的东西在标准库中是不存在的。您可以使用^{} 尽管:
(您可能希望使用
set
,而不是list
,在这种情况下,您将调用.add
,而不是.append
。)作为旁白:看看你写的这两行:
这似乎表明您希望表达式} 和对^{} 的连续调用。也可以只使用两个循环:
a[1]
等于两个不同的值。这在字典中是不可能的,因为它们的键是唯一的,并且每个键都与一个值相关联。但是,可以做的是逐个提取与给定键相关联的列表中的所有值。您可以使用^{只为未来的游客。目前有一个多映射的python实现。可通过pypi获得
相关问题 更多 >
编程相关推荐