首页 / PYTHON / Python的值排序字典?
Python的值排序字典?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python的值排序字典?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1875字,纯文字阅读大概需要3分钟。
内容图文
![Python的值排序字典?](/upload/InfoBanner/zyjiaocheng/748/c9d01bbb26ff493a822da3fe4bf8be01.jpg)
我对Python的dict实现很感兴趣,它为排序值提供了一个迭代接口.即,具有“sortedvalues()”函数的dict.
天真的人可以做排序(dict.values()),但这不是我想要的.每次插入或删除项目时,都必须运行完全排序,这是无效的.
请注意,我不是要求关键字排序的字典(对于那个问题,在Key-ordered dict in Python和Python 2.6 TreeMap/SortedDictionary?中有很好的答案).
解决方法:
问题是您需要按键对其进行排序或散列以获得合理的插入和查找性能.实现它的一种天真的方式是条目的值排序树结构,以及查找键的树位置的字典.您需要深入更新树,因为这个查找字典需要保持正确.基本上,就像你可以为可更新堆做的那样.
我认为有太多的选择可以从这样的结构中制作出一个合理的标准库选项,而它却很少需要.
更新:可能适合您的技巧是使用双重结构:
>像往常一样存储键值对的常规字典
>任何类型的排序列表,例如使用bisect
然后,您必须在两者上实现常见操作:将新值插入到两个结构中.棘手的部分是更新和删除操作.您使用第一个结构查找旧值,从第二个结构中删除旧值,然后(更新时)像以前一样重新插入.
如果您还需要知道密钥,请在b列表中存储(值,密钥)对.
更新2:尝试这个类:
import bisect
class dictvs(dict):
def __init__(self):
self._list = []
def __setitem__(self, key, value):
old = self.get(key)
if old is None:
bisect.insort(self._list, value)
dict.__setitem__(self, key, value)
else:
oldpos = bisect.bisect_left(self._list, old)
newpos = bisect.bisect_left(self._list, value)
if newpos > oldpos:
newpos -= 1
for i in xrange(oldpos, newpos):
self._list[i] = self._list[i + 1]
else:
for i in xrange(oldpos, newpos, -1):
self._list[i] = self._list[i - 1]
self._list[newpos] = value
dict.__setitem__(self, key, value)
def __delitem__(self, key):
old = self.get(key)
if old is not None:
oldpos = bisect.bisect(self._list, old)
del self._list[oldpos]
dict.__delitem__(self, key)
def values(self):
return list(self._list)
我想这不是一个完整的词典.我没有测试删除,只是一个小的更新集.你应该对它进行更大的单元测试,并将values()的返回值与sort(dict.values(instance))的返回值进行比较.这只是为了说明如何使用bisect更新排序列表
内容总结
以上是互联网集市为您收集整理的Python的值排序字典?全部内容,希望文章能够帮你解决Python的值排序字典?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。