【问题标题】:Python sort sprite dict into new dict sorted by namePython将精灵字典排序为按名称排序的新字典
【发布时间】:2017-01-03 20:07:54
【问题描述】:

我有一个字典,它是属性sprite_infoSpriteSheet 类的一部分。 sprite info 保存表单上每个精灵的名称和位置以及 xd/yd,即

{'stone_Wall' : { 'x': '781', 'xd': '70', 'y': '568', 'yd': '70'} ... }

我想做的是按每个名称对字典进行排序。也就是说,列表列表中还有其他名称stone_Rightstone_Mid等等。他们的共同点是stone_

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

进一步说明:

一旦所有内容都排序完毕,我想按名称分隔字典。使用我的示例,对于包含 stonestone_ 的任何键,将其添加到现有字典中的新字典中。

【问题讨论】:

  • 你想在排序后继续添加精灵吗?还是一次性手术?
  • @PeterWood 我没有。除了按键分隔字典外,我根本不会修改它
  • 你认为为什么需要排序?
  • @IanAuld 我将从这个字典中列出字典。列表中的每个 dict 将包含每个类似名称('stone'、'stone_Center' 等)的键值对。从该列表中,我将创建一个 SpriteItem,其中包含该列表中的单个 dict。
  • 您应该使用更多代码和您要解决的实际问题来编辑您的问题。这听起来像是一个 XY 问题。

标签: python python-2.7 sorting dictionary pygame


【解决方案1】:

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

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

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

编辑:再想一想,sorted 将逐个元素比较元组,因此第 0 项(键)将首先比较,并且也是唯一的(因为 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'}),所以我们想要的键是元组的第零个元素,'stone_Wall'

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

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

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 2013-05-01
    • 1970-01-01
    • 2017-12-17
    • 2015-11-12
    • 2018-04-03
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多