Here is my Django code that does not work as expected:
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!
Is there a way to keep the original element order, so the posts would be ordered by added in posts_to_return?
Thank you!
EDIT: Python 2.6, Django 1.3
解决方案
Use SortedDict instead of dict (from django.utils.datastructures import SortedDict)
SortedDict maintains it's order in it's keyOrder attribute. So you can manipulate the ordering without reconstructing dict if you want to. For example, to reverse the SortedDict's order just use keyOrder.reverse()
post_list = SortedDict([(obj.id, obj) for obj in posts])
# reversing the post order in-place
post_list.keyOrder.reverse()