Создать словарь из списка определенным образом

Есть матрица значений и список ккординат.

Матрица значений:

[[ 33   0  33 229]
 [233 109 255 109]
 [ 60  72  60  59]
 [108   0 255  24]
 [ 59 229  77 108]
 [ 72  24  77 233]]

Список координат :

   coords = 
          [(1190, 135), (1352, 135), (1514, 135), (1676, 135)],
          [(1199, 297), (1352, 297), (1514, 297), (1676, 297)],
          [(1190, 459), (1352, 459), (1514, 459), (1676, 459)],
          [(1190, 621), (1352, 621), (1514, 621), (1676, 621)],
          [(1190, 783), (1352, 783), (1514, 783), (1676, 783)],
          [(1190, 945), (1352, 945), (1514, 945), (1676, 945)]

Значений в матрице повторяются, у каждого значений есть пара. Всего в матрице 12 пар, а значит 24 значения. В списке координат тоже 24 значения. 24 (x,y).

Задача:

Сформировать словарь вида : { значение: [(x1,y1),(x2,y2)]}

Конкретный пример с использованием списка и матрицы из условия:

{ 33:[(1190,135),(1514,135)],
   0:[(1352,135),(1352,621)],
 229:[(1676,135),(1352,783)],
 233:[(1199,297),(1676,945)],
 109:[(1352,297),(1676,297)],
 255:[(1514,297),(1514,621)],
  60:[(1190,459),(1514,459)],
  72:[(1352,459),(1190,945)],
  59:[(1676,459),(1190,783)],
 108:[(1190,621),(1676,783)],
  24:[(1676,621),(1352,945)],
  77:[(1514,783),(1514,945)]}

Тоесть теперь значений 12. Но у каждого значения теперь по 2 пары координат.

Приведу в пример значение 33 из матрицы.

33 это первое и третье значение в матрице, значит у него должна быть первая и третья координата.

33:[(1190,135),(1514,135)]

Надеюсь задача понятна, если нет, задавайте вопросы в комментариях.Заранее спасибо.


Ответы (1 шт):

Автор решения: вася
from itertools import chain

matrix = [[ 33, 0, 33, 229],
          [233, 109, 255, 109],
          [60, 72, 60, 59],
          [108, 0, 255, 24],
          [59, 229, 77, 108],
          [72, 24, 77, 233]]

coords = [(1190, 135), (1352, 135), (1514, 135), (1676, 135),
          (1199, 297), (1352, 297), (1514, 297), (1676, 297),
          (1190, 459), (1352, 459), (1514, 459), (1676, 459),
          (1190, 621), (1352, 621), (1514, 621), (1676, 621),
          (1190, 783), (1352, 783), (1514, 783), (1676, 783),
          (1190, 945), (1352, 945), (1514, 945), (1676, 945)]

new_dict = {}

for pos, item in enumerate(chain.from_iterable(matrix)):
  new_dict.setdefault(item, []).append(coords[pos]) 

print(new_dict)
  
→ Ссылка