我尽量避免在这里重复发明轮子。我想确认哪些高性能的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
复制相似问题