Python将sprite dict排序为按名称排序的新dict

时间:2016-08-27 06:55:26

标签: python python-2.7 sorting dictionary pygame

我有一个dict,它是属性SpriteSheet的{​​{1}}类的一部分。 sprite_info保存工作表上每个精灵的名称和位置以及xd / yd,即

sprite info

我想做的是按每个名字排序。换句话说,列表列表{'stone_Wall' : { 'x': '781', 'xd': '70', 'y': '568', 'yd': '70'} ... } stone_Right中还有其他名称,依此类推。他们都有一个共同点是stone_Mid

最有效的方法是什么?我有限的经验告诉我要进入一堆嵌套的for循环,但我知道有更好的方法。

进一步澄清:

一旦一切都被排序,我想按名称分开字典。使用我的示例,对于包含stone_stone的任何键,将其添加到已存在的词典中的新词典中。

1 个答案:

答案 0 :(得分:0)

您无法对dict进行排序,因为它在内部使用自己的排序树结构以保持效率。

您可以使用OrderedDict来跟踪添加的订单元素。

要从OrderedDict创建排序dict,请根据dictkey中的键/值对进行排序。

编辑:稍微考虑一下,sorted会逐元素地比较元组,因此首先比较项目零(键),并且也是唯一的(因为dict具有唯一键),所以我们不需要使用sorted key参数做任何聪明的事情。

from collections import OrderedDict
# from operator import itemgetter

sprites = dict()
# sorted_sprites = OrderedDict(sorted(sprites.items(), key=itemgetter(0)))
sorted_sprites = OrderedDict(sorted(sprites.items()))  # equivalent to above

sorted是一个内置函数,它从序列中返回list

key参数确定如何对序列中的值进行排序。当我们通过sprites.items()时,它会获得元组对,例如('stone_Wall', { 'x': '781', 'xd': '70', 'y': '568', 'yd': '70'}),所以我们想要的关键是元组的第0个元素'stone_Wall'

itemgetter是一个函子,它将从序列中检索特定对象(或多个对象)。在这里,我们要求它获得零。

但是,如上所述,默认元组比较将为我们执行此操作。请参阅此相关问题:python tuple comparison