Тот словарь, который получился изначально, кажется, не очень подходит под задачу.
Можно сделать список пересечений цветов и дальше итеративно отфильтровывать этот список, находя цвета, над которыми нет пересечений.
# Массив туплов формата (нижний цвет, верхний цвет)
crossovers = [('red', 'blue'), ('red', 'green'), ('green', 'blue'), ('green', 'yellow')]
colors_to_sort =[]
for crossover in crossovers:
colors_to_sort.append(crossover[0])
colors_to_sort.append(crossover[1])
colors_to_sort = list(set(colors_to_sort))
colors_top_bottom = []
def is_top_color(color, crossovers):
if not list(filter(lambda x: x[0] == color ,crossovers)):
return True
else:
return False
while len(colors_to_sort) > 0:
found_top_color = False
for color in colors_to_sort[:]:
if is_top_color(color, crossovers):
found_top_color = True
colors_top_bottom.append(color)
colors_to_sort.remove(color)
crossovers = list(filter(lambda x: x[1] != color, crossovers))
if not found_top_color:
print('Невозможное наложение прямоугольников')
break
print(colors_top_bottom)