主キーが文字列形式「YYYYMMDD HH:MM:SS」のタイムスタンプである辞書のデフォルトの辞書があります。キーは順番に入力されます。最後に入力されたキーまたはタイムスタンプが最新のキーにアクセスするにはどうすればよいですか?
4 に答える
最後に入力した項目にアクセスする必要がある場合OrderedDict
は、モジュールからを使用してください。collections
ただし、継続的な並べ替えを維持する必要がある場合は、完全に異なるデータ構造を使用するか、少なくともインデックス作成の目的で補助的なデータ構造を使用する必要があります。
編集:最後の要素にアクセスすることが非常にまれにしか実行しない操作である場合は、dictのキーを並べ替えて最大値を選択するだけで十分な場合があることを付け加えておきます。ただし、これを頻繁に行う必要がある場合は、並べ替えを繰り返すと非常にコストがかかります。コードの動作に応じて、最も簡単なアプローチは、任意の時点で、最後に追加されたキーや追加された最大値を含む単一の変数を維持することです(つまり、辞書に追加されるたびに更新されます) )。ただし、最後の項目だけにとどまらない追加の記録を保持したいが、継続的な並べ替えを必要としない場合は、OrderedDict
が理想的です。
組み込みのdictではなくOrderedDictを使用する
あなたはこのようなことを試すことができます:
>>> import time
>>> data ={'20120627 21:20:23':'first','20120627 21:20:40':'last'}
>>> latest = lambda d: time.strftime('%Y%m%d %H:%M:%S',max(map(lambda x: time.strptime(x,'%Y%m%d %H:%M:%S'),d.keys())))
>>> data[latest(data)]
'last'
ただし、大規模なデータセットではおそらく低速になります。
誰が最後に入場したかを (入場時刻に従って) 知りたい場合は、以下の例を参照してください。
import datetime
format='%Y%m%d %H:%M'
Dict={'20010203 12:00':'Dave',
'20000504 03:00':'Pete',
'20020825 23:00':'kathy',
'20030102 01:00':'Ray'}
myDict={}
for key,val in Dict.iteritems():
TIME= str(datetime.datetime.strptime(key,format))
myDict[TIME]= val
myDict=sorted(myDict.iteritems(), key=lambda (TIME,v): (TIME))
print myDict[-1]