2012-02-09 18 views
6

Python'da karma tablo uygulamak istiyorum. Tabloda, bir sınıf nesnesi anahtar değeri ile ilişkilendirilecektir. Sorun, sınıfın dizinini bulmak ve güncellemek için anahtar değerini kullanmak istiyorum (tabii ki sorun değil). Ancak, tabloyu sınıfın belirli bir değerini kullanarak sıralamak istersem, ne yapabilirim? Örneğin, üç değerimiz var: document_id, skoru ve sıralaması. "Skor" ve "sıralama" dan oluşan bir sınıf "belge" var. "document_id" tablonun anahtarı olacaktır.Python karma tablosu tasarımı

"document_id" anahtarını kullanarak tablonun çeşitli girişlerinin "skorunu" güncelleştirmek istiyorum. Ancak puanların güncellenmesi yapılırken, listeyi/tabloyu skoru kullanarak sıralamak ve güncellenmiş puana göre "rank" değişkenine rank değerini atamak istiyorum.

Birisi bana nasıl devam edebilirim konusunda biraz yol gösterebilir mi? Ya da sadece bir liste yapmalı mıyım?

Tablonun maksimum öğe sayısı 25000-30000 kadar olabilir.

Teşekkürler.

cevap

21

Python'un dict halihazırda bir hash tablosudur. Böyle

docs = sorted(doc_hash.itervalues(), key=operator.attrgetter('score'), reverse=True) 
for i, doc in enumerate(docs): 
    doc.rank = i 
+0

Cevabınız için teşekkür ederiz. Ancak, bir belgeyi her güncellediğimde/eklediğimde sıralamayı güncellemeye devam edersem, tüm ekleme/güncelleme işlemlerinin sonunda bir sıralama yerine döngü sırasının sırası hızla artmaz mı? Sıralarda daha fazla bir şey yapmayacağım. Onları sıraladıktan sonra, onları bir dosyaya koyacağım. –

+0

"Hızla artıyor" ile ne demek istediğini anlamıyorum? Bir grup dokümanı ekleyebilir ve ardından sıraları bir defada yeniden atayabilirsiniz. "Her eklediğinizde" kelimesini kaçırdım. –

+0

Üzgünüm, doküman ekleme işleminin sonundaysa, sorun değil. Masanın büyüklüğünden bahsediyordum. Büyük bir masada bir girişi girdiğimde/güncellediğimde biraz sıralama yapmaya çalışırsam uzun bir süreç olabilir diye düşündüm. –

0

şey:

doc_hash = {} 
doc_hash[doc.id] = doc 

rütbe atamak için?

sorted_keys = sorted(d.keys(), key=lambda element: element['score']) 
for i in range(len(sorted_keys)): 
    d[sorted_keys[i]]['rank'] = i 

d her öğe atadığı skoruna göre bir seviye (elemanlar da sözlükleri olduğu ima edilmektedir).

+9

'Numaralandır 'hakkında daha fazla bilgi edinin. Seni mutlu edecek :) –

4

Neden bir OrderedDict kullanmıyorsunuz?

>>> from collections import OrderedDict 

>>> # regular unsorted dictionary 
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

>>> # dictionary sorted by key 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) 
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

>>> # dictionary sorted by value 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) 
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) 

>>> # dictionary sorted by length of the key string 
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])