2016-04-10 21 views
1

Ben nispeten yeni bir Python (3) programcısıyım. Koleksiyonların özelliklerini birleştiren bir veri yapısına ihtiyacım var. Kazıcı, deque ve set, ve daha fazla deneyime sahip birisinin en "pythonic" yaklaşımı önerebileceğini umuyordum.Python: koleksiyonları. Deque tarzı sipariş ile yarışan.

Tam sayı dizisi koleksiyonum var ve her dizinle ilişkili sayıları korumak gerekir - Sayaç gibi. Ama aynı zamanda indeks: sayım çiftleri arasında örtük bir sıralamayı korumak istiyorum, böylece ben örn. dizinini bilmeden en eski olanı çıkar - bir deque gibi. Son olarak, bir dizin gibi bir dizinin mevcut olup olmadığını rahatlıkla kontrol edebilmeyi isterim. Son olarak, önemli olması durumunda, scypy.stats rv_discrete kullanmak için sayım tarafından ağırlıklandırılan olasılıkları seçmek istiyorum.

Düşünceleriniz çok takdir edilir.

+1

Sınıf OrderedCounter (Sayaç, OrderedDict): pass' hakkında ne dersiniz? – timgeb

+0

@timgeb Python'un bunun gibi birden fazla mirasa izin verdiğini bilmiyordum. Bu konuda dokümanlar hakkında daha fazla bilgiyi nerede okuyabilirim? –

+0

@AkshatMahajan iyi, bunu yapıyor :) – timgeb

cevap

0

Tanımınıza göre, sipariş edilen sayaçların çoğu bunu yapmalıdır. OrderedDict, ekleme siparişinin kaydını tutar ve Counter, öğelerin sıklığını izler.

Demo:

>>> from collections import OrderedDict, Counter 
>>> class OrderedCounter(Counter, OrderedDict): 
...  pass 
>>> 
>>> oc = OrderedCounter() 
>>> oc[0] = 5 
>>> oc[2] = 27 
>>> oc 
OrderedCounter({2: 27, 0: 5}) 
>>> oc.update({2:1, 0:6, 7:1}) 
>>> oc 
OrderedCounter({2: 28, 0: 11, 7: 1}) 
>>> oc.popitem() 
(7, 1) 
>>> oc.popitem() 
(2, 28) 
>>> oc.popitem() 
(0, 11) 

Sen oc.keys()[0] ilk sokulan anahtar alabilir.