Python:字典中的元素顺序

Sil*_*ght 3 python django

这是我的Django代码不能按预期工作:

posts = Post.objects.all().order_by('-added')[:20] # ordered by 'added'
post_list = dict([(obj.id, obj) for obj in posts])

# ... some operations with dictionary elements go here ...

posts_to_return = [post for post_id, post in post_list.items()] # order by 'id' now!
Run Code Online (Sandbox Code Playgroud)

有没有一种方法,以保持原有的元素顺序,这样的职位将被责令addedposts_to_return

谢谢!

编辑: Python 2.6,Django 1.3

Dae*_*yth 6

python(和大多数语言)中的Dicts没有顺序.你应该改用collections.OrderedDict.这将保留添加项目的顺序.sorted()如果添加顺序不是您要保留的顺序,也可以查看内置函数.


Imr*_*ran 6

使用SortedDict而不是dict(from django.utils.datastructures import SortedDict)

SortedDict在其keyOrder属性中维护它的顺序.因此,如果您愿意,可以在不重建字典的情况下操纵排序.例如,要反转SortedDict的顺序,只需使用keyOrder.reverse()

post_list = SortedDict([(obj.id, obj) for obj in posts])
# reversing the post order in-place
post_list.keyOrder.reverse()
Run Code Online (Sandbox Code Playgroud)