2012-02-09 2 views
6

파이썬에서 해시 테이블을 구현하고 싶습니다. 테이블에서 클래스 객체는 키 값과 연결됩니다. 문제는 키 값을 사용하여 클래스 색인을 찾고 업데이트하는 것입니다 (물론 문제는 아닙니다). 그러나 클래스의 특정 값을 사용하여 테이블을 정렬하려면 어떻게해야합니까?파이썬 해시 테이블 디자인

예를 들어 document_id, score 및 rank의 세 가지 값이 있다고 가정 해 보겠습니다. "score"와 "rank"로 구성된 클래스 "document"가 있습니다. "document_id"는 테이블의 키입니다.

키 "document_id"를 사용하여 테이블의 다양한 항목의 "점수"를 업데이트하고 싶습니다. 그러나 점수 업데이트가 완료되면 점수를 사용하여 목록/표를 정렬하고 업데이트 된 점수에 따라 순위 변수를 "순위"변수에 할당하려고합니다.

진행 방법에 대한 친절한 가이드가 있습니까? 아니면 단순히 목록으로 만들어야합니까?

테이블의 최대 항목 수는 최대 25000-30000 개입니다.

감사합니다.

답변

21

파이썬의 dict는 이미 해시 테이블입니다. 이 같은

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

답장을 보내 주셔서 감사합니다. 그러나 내가 문서를 업데이트/삽입 할 때마다 순위를 업데이트하려고하면 모든 삽입/업데이트가 끝날 때 정렬보다는 루프의 순서가 빠르게 증가하지 않을까요? 나는 계급에 대해 더 많은 것을하지 않을 것이다. 그것들을 소트 한 후에는 파일에 넣을 것입니다. –

+0

"빠르게 증가"한다는 것이 무슨 뜻인지 몰라? 여러 개의 문서를 추가 한 다음 끝에 순위를 한꺼번에 재 할당 할 수 있습니다. 나는 "당신이 하나를 삽입 할 때마다"에 대해 미루다. –

+0

죄송합니다. 문서 추가가 끝나면 괜찮습니다. 나는 테이블의 크기에 대해서 이야기하고있었습니다. 나는 거대한 테이블에 엔트리를 입력/업데이트 할 때마다 정렬을 실행하려고하면 오랜 시간이 걸릴 수도 있다고 생각했습니다. –

0

뭔가 :

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

는 순위를 지정하려면?

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

d는 각 요소에 할당 한 그것의 점수에 기초하여 랭크 (요소뿐만 아니라 사전 것으로 함축된다).

+9

'열거'에 대해 자세히 알아보십시오. 그것은 당신을 행복하게 만들 것입니다 :) –

4

OrderedDict을 사용하지 않으시겠습니까?

>>> 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)])