Python有没有默认sort by key的dict?

2013-05-16 06:12:43 +08:00
 ruoran
就是像Java TreeMap那样用红黑树实现的东西?
collection.OrderedDict是维持insert先后的顺序,不是我想问的那种。
主要是想用一个call来取第n大的数据。
5380 次点击
所在节点    Python
10 条回复
Hualin
2013-05-16 09:04:36 +08:00
keys = sorted(block_info.__dict__.keys())
for key in keys:
sort_block_info.append([key, getattr(block_info, key)])

不知道这段代码对你没用。前提是你的 dict 的 key 命名的字母序是有意义的。比如叫 field1 field2...
SErHo
2013-05-16 09:11:00 +08:00
yegle
2013-05-20 02:56:24 +08:00
Livid
2013-05-20 03:19:47 +08:00
monkeylyf
2013-05-20 03:31:43 +08:00
OrderedDict + 1
hhrmatata
2013-05-20 09:19:29 +08:00
python 2.7+支持collections.OrderedDict
ruoran
2013-05-20 09:26:50 +08:00
@Hualin @SErHo @Livid @yegle @monkeylyf 谢谢!OrderedDict是可以满足需求,但是感觉@Livid说的这个更能解决根本需求 http://www.redis.io/commands/zadd 这个看上去在add时就已经排序了,而且logn。不太想每次get都要排序一下那种,nlogn。
DH
2013-05-20 09:42:13 +08:00
看你的key是什么样的,还有你的具体需求。排序的话,
可以用 heapq

h = []
heappush(h, ('key8', 'write code'))
heappush(h, ('key1', 'release product'))
heappush(h, ('key3', 'write spec'))
heappush(h, ('key6', 'create tests'))

heappop(h)
# ('key1', 'release product')
heappop(h)
# ('key3', 'write spec')
heappop(h)
# ('key3', 'write spec')
heappop(h)
# ('key8', 'write code')
DH
2013-05-20 09:47:06 +08:00
还可以用 bisect

h = []
bisect.insort_left(h, ('key1', 'test'))
bisect.insort_left(h, ('key2', 'test'))
bisect.insort_left(h, ('key0', 'test'))

h
# [('key0', 'test'), ('key1', 'test'), ('key2', 'test')]
reusFork
2013-05-20 12:00:53 +08:00
用heap

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/69022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX