Как работать с более сложными критериями сортировки / группировки элементов в списке?

I’V наткнулся на проблему, с которой я борюсь во время обучения python, и
В моем примере у меня есть список, заполненный объектами (эти объекты сами по себе списки, которые могут быть доступны по отдельности)

list_objects =[object5, object2, object4, object1, ojbject3, object6, object7, object8, object9]

Каждый объект имеет функции, указывающие на другой объект:

  • input0()
  • input1()
  • выход()

Некоторые объекты могут быть связаны друг с другом, например, это может быть:

object5.input0() == object4 # object5 input points to object4

И иногда может случиться так, что некоторые из объектов связаны с другими объектами, которые не list_objectsпохожи:

object4.input0() == objectA

или как:

object4.input1() == objectM1

И, наконец, может случиться, что несколько объектов связаны друг с другом, как это (я постараюсь объяснить это так хорошо, как я могу с некоторым рисунком):

objectA
   | # this is output of objectA
   |
   v # this is input0 of object4
object4 < # input1 of object 4 
   |      
   |       -- objectM1
   v      /
object5 < # input1 of object 4
   |
   |
   v
objectB
   |
   |
   v
object1 <
   |     
   |      
   v       
object2 <--- objectM2
   |       /
   |      /
   v     /
object3 <
   |
   |
   v
object6 <
   |     
   |      
   v       
object8 <--- objectM3
   |       /|
   |      / |
   v     /  |
object7 <   |
   |       /
   |      /
   v     /
object9 <
   |
   |
   v
#(here is None or it goes on)

И теперь желаемый результат заключается в том, что я каким-то образом фильтрую объекты list_objectsи получаю только первые и последние объекты, которые связаны друг с другом, как это:

new_list =[[object4, object5], [object1, object3], [object6, object9]]

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

Надеюсь, я достаточно ясно объяснил проблему.

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

Спасибо!

1 ответ

  1. У вас есть график на руках, я предлагаю вам относиться к нему как к одному.

    Первая модель представляет собой неориентированный граф и ищет циклы, содержащие внешние узлы. Найдите самый длинный цикл для каждого из этих узлов.

    Затем посмотрите на направленный график (в значительной степени то, что у вас есть в вашем чертеже), чтобы найти два узла, которые вы хотите сообщить для каждого цикла.