我有一个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
的任何键,将其添加到已存在的词典中的新词典中。
答案 0 :(得分:0)
您无法对dict
进行排序,因为它在内部使用自己的排序树结构以保持效率。
您可以使用OrderedDict
来跟踪添加的订单元素。
要从OrderedDict
创建排序dict
,请根据dict
对key
中的键/值对进行排序。
编辑:稍微考虑一下,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