我尽量避免在这里重新发明轮子。我想确认哪些高性能 python 集合是 Pharo 中最近的亲戚:
柜台就是一个袋子
- Python:计数器: https://docs.python.org/2/library/collections.html#collections.Counter
- Pharo:包
保持元素插入顺序的字典:
- Python:OrderedDict
- Pharo:OrderedDictionary(在官方图片中找到)
默认字典是创建您尝试访问的任何项目的字典
- Python:默认字典: https://docs.python.org/2/library/collections.html#defaultdict-object
- Pharo:ZnMultiValueDictionary?
(defaultdict 可用于使用多个键创建树):
d[key1][key2][key3] = value
双端队列(Deque):支持从任意一端添加和删除元素
- Python:双端队列(双端队列): https://docs.python.org/2/library/collections.html#deque-objects
- Pharo:OrderedCollection?
我的假设是否正确? 是否有另一个 Collection 子类可以更好地替代上述情况?
请您参考如下方法:
这个问题有两个不同的答案。一个简短,另一个更详细。
简短的回答是肯定的,你的假设是正确的,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)
有序字典
Dictionary之间的区别和一个 OrderedDictionary就是前者是无序的,而后者是记住加法顺序的。因此,它们也表现为 OrderedCollections , 除了在这种情况下键是隐式索引1 , 2等(回想一下,在 Smalltalk 中索引总是基于 1 的。)我们为拥有这两个特性(通用键和排序)付出的代价主要是 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因此很容易预见值(value)的内在分配。
