我尽量避免在这里重复发明轮子。我想确认哪些高性能的python集合是Pharo中最接近的亲缘关系:
A Counter is a Bag
保持元素插入顺序的字典:
默认字典是创建您尝试访问的任何项目的字典
(可以使用defaultdict通过多个key创建树):
d[key1][key2][key3] = value
双端队列(Deque):支持在任意一端队列()中添加和移除元素
双端队列:https://docs.python.org/2/library/collections.html#deque-objects
:
我的假设是正确的吗?是否有另一个Collection子类可以更好地替代上述情况?
发布于 2018-08-08 09:10:33
这个问题有两个不同的答案。一个简短,另一个更详细。
简短的答案是肯定的,你的假设是正确的,Count
是Bag
,OrderedDict
是OrderedDictionary
,依此类推。
一个更详细的答案应该至少包括一些例子。
Bag
这是一个无序集合,用于跟踪重复操作(也称为occurrences
)
bag := Bag new.
bag add: 'Hello'; add: 3; add: 'Hello'.
self
assert: (bag occurrencesOf: 'Hello') = 2;
assert: (bag occurrencesOf: 3) = 1;
assert: (bag occurrencesOf: 'foo') = 0
不熟悉Bag
的人倾向于使用Dictionary
来计算重复次数。这不是必需的,Bags
就是以这种方式实现的,所以不需要重新实现这些集合。
请注意Bag
和Set
之间的区别。虽然两者都是无序的,但后者将只保留同一实例的一个条目:
set := Set new.
set add: 3; add: 3.
set asArray = #(3)
而
bag := Bag new.
bag add: 3; add: 3.
bag asArray = #(3 3)
OrderedDictionary
Dictionary
和OrderedDictionary
的区别在于前者是无序的,而后者会记住加法的顺序。因此,它们的行为也类似于OrderedCollections
,除了在本例中键是隐式的索引1
、2
等(回想一下,在Smalltalk中索引总是1
-based )。我们为拥有这两个特性(通用密钥和排序)而付出的代价主要是复制values
集合。但是请注意,实现这些对象有不同的替代方案。
dictionary := OrderedDictionary new.
dictionary
at: 'c' put: 'CC';
at: 'b' put: 'BB';
at: 'a' put: 'AA'.
dictionary asArray = #('CC' 'BB' 'AA')
然而,
dictionary := Dictionary new.
dictionary
at: 'c' put: 'CC';
at: 'b' put: 'BB';
at: 'a' put: 'AA'.
dictionary asArray = #('AA' 'BB' 'CC')
基本上是因为'a' hash < 'b' hash < 'c' hash
,因此很容易预见到值的内部分配。
https://stackoverflow.com/questions/51414622
复制相似问题