Сортировка двумерного словаря по определенному ключу

Статус
Закрыто для дальнейших ответов.

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
Предварительные данные:
  1. Указать свою операционную систему - WINDOWS 10
  2. Указать версию Python - PYTHON 3.8.0
  3. Укажите версию библиотек с которыми работаете, вставьте в спойлер вывод команды pip list
    1. Скрин №206 (04.12.2020 21).png
  4. Описание вопроса ниже

Здравствуйте. Есть словарь такого типа
Код:
{
    0: {
        'x': 943,
        'y': 716,
        'img': <array>,
        'label': 0
    },
    1: {
       'x': 943,
       'y': 716,
       'img': < array >,
       'label': 1
    },
    ...
}

Есть ли алгоритм, который позволит отсортировать данный словарь по ключу "label"?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 569
456
83
если я правильно понял вопрос, то можно так
Python:
d = {
    5: {
        'x': 943,
        'y': 716,
        'img': '',
        'label': 4
    },
    16: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 1
    },
    7: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 10
    }
}
list_d = list(d.items())
list_d.sort(key=lambda i: i[1]['label'])
for i in list_d:
    print(i)
 
  • Мне нравится
Реакции: VolodinAS

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
если я правильно понял вопрос, то можно так
Python:
d = {
    5: {
        'x': 943,
        'y': 716,
        'img': '',
        'label': 4
    },
    16: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 1
    },
    7: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 10
    }
}
list_d = list(d.items())
list_d.sort(key=lambda i: i[1]['label'])
for i in list_d:
    print(i)
Спасибо Вам огромное! Всё замечательно работает!
Код:
SortedMainData:
[(5, {'x': 1426, 'y': 790, 'img': array(), 'label': 0}),
(9, {'x': 584, 'y': 359, 'img': array(), 'label': 0}),
(0, {'x': 759, 'y': 492, 'img': array(), 'label': 1}),
(2, {'x': 306, 'y': 769, 'img': array(), 'label': 1}),
(6, {'x': 943, 'y': 657, 'img': array(), 'label': 2}),
(7, {'x': 773, 'y': 1136, 'img': array(), 'label': 2}),
(1, {'x': 551, 'y': 996, 'img': array(), 'label': 3}),
(3, {'x': 311, 'y': 369, 'img': array(), 'label': 3}),
(4, {'x': 551, 'y': 466, 'img': array(), 'label': 4}),
(8, {'x': 1369, 'y': 1192, 'img': array(), 'label': 4})]
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
если я правильно понял вопрос, то можно так
Python:
d = {
    5: {
        'x': 943,
        'y': 716,
        'img': '',
        'label': 4
    },
    16: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 1
    },
    7: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 10
    }
}
list_d = list(d.items())
list_d.sort(key=lambda i: i[1]['label'])
for i in list_d:
    print(i)
Единственное, в чем небольшая загвоздка, массив по ключам стал неупорядоченным:
Код:
[(5, {'x': 1426, 'y': 790, 'img': array(), 'label': 0}),
(9, {'x': 584, 'y': 359, 'img': array(), 'label': 0}),
(0, {'x': 759, 'y': 492, 'img': array(), 'label': 1}),
(2, {'x': 306, 'y': 769, 'img': array(), 'label': 1}),
(6, {'x': 943, 'y': 657, 'img': array(), 'label': 2}),
(7, {'x': 773, 'y': 1136, 'img': array(), 'label': 2}),
(1, {'x': 551, 'y': 996, 'img': array(), 'label': 3}),
(3, {'x': 311, 'y': 369, 'img': array(), 'label': 3}),
(4, {'x': 551, 'y': 466, 'img': array(), 'label': 4}),
(8, {'x': 1369, 'y': 1192, 'img': array(), 'label': 4})]

И когда я пытаюсь обратиться к элементу, он выдает ошибку:
File "D:/DOCUMENTS/ПРОГРАММИРОВАНИЕ/PYTHON/PROJECTS/PYCHARM/me2saveautocracker/2020-12-03-23-21/Main_Reset.py", line 204, in callback
SortedElement = SortedMainData[SortedMainDataIndex]
TypeError: list indices must be integers or slices, not tuple

Сам код:
Python:
SortedMainData = list(MainData.items())
SortedMainData.sort(key=lambda i: i[1]['label'])

print('SortedMainData:')

print(SortedMainData)

for SortedMainDataIndex in SortedMainData:
    SortedElement = SortedMainData[SortedMainDataIndex]
    print(SortedElement)
 

VolodinAS

Новичок
Пользователь
Дек 3, 2020
35
0
6
31
Россия, Тольятти
если я правильно понял вопрос, то можно так
Python:
d = {
    5: {
        'x': 943,
        'y': 716,
        'img': '',
        'label': 4
    },
    16: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 1
    },
    7: {
       'x': 943,
       'y': 716,
       'img': '',
       'label': 10
    }
}
list_d = list(d.items())
list_d.sort(key=lambda i: i[1]['label'])
for i in list_d:
    print(i)
А нет, всё разобрался. Я думал, надо будет по индексу шагать, а оказывается, в цикле и был элемент массива:
Python:
for SortedElement in SortedMainData:
    SortedElementData = SortedElement[1]
    # print(SortedElementData)
    clickX = SortedElementData['x']
    clickY = SortedElementData['y']
    pyautogui.click(x=clickX, y=clickY)

Всё работает, спасибо большое еще раз!
 
Статус
Закрыто для дальнейших ответов.

Форум IT Специалистов