@13_nastya_13

Как отсортировать словарь следуя порядку ключей в списке?

Здравствуйте! Есть список с правильным порядком ключей, например список: [(255, 0, 0), (0, 255, 0), (0, 0, 255), (0, 255, 255), (255, 255, 0)]
И есть словарь который следуя порядку указанному выше, нужно отсортировать, например этот словарь: {(0, 0, 255): ((0, 0, 5), (0, 0, 5), (0, 0, 23), (0, 0, 23)), (255, 0, 0): ((0, 0, 10), (0, 0, 10), (0, 0, 21), (0, 0, 21)), (0, 255, 0): ((0, 0, 15), (0, 0, 15), (0, 0, 21), (0, 0, 21)), (255, 255, 0): ((0, 0, 20), (0, 0, 20), (0, 0, 21), (0, 0, 21)), (0, 255, 255): ((0, 0, 24), (0, 0, 24), (0, 0, 21), (0, 0, 21))}
Как это можно сделать, при этом не используя импорт каких либо библиотек?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Как-нибудь так:

l = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (0, 255, 255), (255, 255, 0)]

d = {(0, 0, 255): ((0, 0, 5), (0, 0, 5), (0, 0, 23), (0, 0, 23)), (255, 0, 0): ((0, 0, 10), (0, 0, 10), (0, 0, 21), (0, 0, 21)), (0, 255, 0): ((0, 0, 15), (0, 0, 15), (0, 0, 21), (0, 0, 21)), (255, 255, 0): ((0, 0, 20), (0, 0, 20), (0, 0, 21), (0, 0, 21)), (0, 255, 255): ((0, 0, 24), (0, 0, 24), (0, 0, 21), (0, 0, 21))}

d2 = sorted(d.items(), key=lambda x:l.index(x[0]))

print (d2)


Тут сортировка по индексу каждой тройки типа (255,0,0) в списке l.
Ответ написан
adugin
@adugin Куратор тега Python
Начиная с Python 3.6 ключи в словаре сохраняются в порядке добавления:
mask = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (0, 255, 255), (255, 255, 0)]

src = {
    (0, 0, 255): ((0, 0, 5), (0, 0, 5), (0, 0, 23), (0, 0, 23)),
    (255, 0, 0): ((0, 0, 10), (0, 0, 10), (0, 0, 21), (0, 0, 21)),
    (0, 255, 0): ((0, 0, 15), (0, 0, 15), (0, 0, 21), (0, 0, 21)),
    (255, 255, 0): ((0, 0, 20), (0, 0, 20), (0, 0, 21), (0, 0, 21)),
    (0, 255, 255): ((0, 0, 24), (0, 0, 24), (0, 0, 21), (0, 0, 21))
}

dst = {key:src[key] for key in mask} 

# Или так:
dst = dict(zip(mask, map(src.get, mask)))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmshar
Не очень понятно, в чем проблема:
Если словарь надо именно "отсортировать", т.е. сделать так, что-бы он следовал общепринятому порядку сортировки то:
d={(0, 0, 255): ((0, 0, 5), (0, 0, 5), (0, 0, 23), (0, 0, 23)), 
 (255, 0, 0): ((0, 0, 10), (0, 0, 10), (0, 0, 21), (0, 0, 21)), 
 (0, 255, 0): ((0, 0, 15), (0, 0, 15), (0, 0, 21), (0, 0, 21)), 
 (255, 255, 0): ((0, 0, 20), (0, 0, 20), (0, 0, 21), (0, 0, 21)), 
 (0, 255, 255): ((0, 0, 24), (0, 0, 24), (0, 0, 21), (0, 0, 21))}

d1=dict(sorted(d.items()))
d1


Out[99]:
{(0, 0, 255): ((0, 0, 5), (0, 0, 5), (0, 0, 23), (0, 0, 23)),
(0, 255, 0): ((0, 0, 15), (0, 0, 15), (0, 0, 21), (0, 0, 21)),
(0, 255, 255): ((0, 0, 24), (0, 0, 24), (0, 0, 21), (0, 0, 21)),
(255, 0, 0): ((0, 0, 10), (0, 0, 10), (0, 0, 21), (0, 0, 21)),
(255, 255, 0): ((0, 0, 20), (0, 0, 20), (0, 0, 21), (0, 0, 21))}

Если же у вас есть какой-то специфический "правильный порядок", и он вам известен, то просто берете поэлементно ключи из списка "правильного порядка" и ищете соответствующий элемент из начального списка. Без всяких библиотек, простейший цикл.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы