2016-08-27 3 views
1

У меня есть dict, который является частью класса SpriteSheet атрибута sprite_info. sprite info содержит имена и расположение и Xd/ярд каждого спрайта на листе, т.е.Python sort sprite dict в новый dict, отсортированный по имени

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

То, что я хотел бы сделать это своего рода ДИКТ каждым именем. Другими словами, есть другие имена в списке списка stone_Right и stone_Mid и так далее. Единственное, что у них общего есть: stone_.

Каков наиболее эффективный способ сделать это? Мой ограниченный опыт подсказывает мне просто войти в кучу вложенных циклов, но я знаю, что есть лучший способ.

Дальнейшее уточнение:

После того, как все сортируется, я хотел бы отделить Dict по имени. Используя мой пример, для любого ключа, который включает stone или stone_, добавьте его в новый dict в уже существующем dict.

+0

Вы хотите продолжать добавлять спрайты после его сортировки? Или это одноразовая операция? –

+0

@PeterWood нет. Помимо разделения dict по ключам, я вообще не буду его изменять – David

+1

Почему, по вашему мнению, сортировка требуется? – IanAuld

ответ

0

Вы не можете сортировать dict, так как он использует свою собственную сортированную структуру дерева внутри, чтобы поддерживать эффективность.

Вы можете использовать OrderedDict, который будет отслеживать элементы заказа.

Чтобы создать отсортированный OrderedDict с dict, соберите пары ключ/значение из dict на основе key.

Редактирование: подумав немного больше, sorted будет сравнивать элементы набора по элементам, поэтому сначала будет сравниваться нулевой элемент (ключ), а также будет уникальным (поскольку dict имеет уникальные ключи), поэтому мы не делаем нужно сделать что-нибудь умное с параметром sortedkey.

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 - это функтор, который будет извлекать определенный объект (или объекты) из последовательности. Здесь мы просим его получить нуль-й.

Однако, как указано выше, сравнение кортежей по умолчанию сделает это для нас. См. Этот родственный вопрос: python tuple comparison

Смежные вопросы