2017-07-24 3 views
0

J'ai une liste de tuples parents d'enfantsPython: la commande à partir d'une liste de valeurs parents des enfants

childParentList = [('green', 'blue'), ('red', 'blue'), ('black', 'green'), ('white', 'red')] 

Comment puis-je obtenir l'ordre topologiques de cette liste à partir de critères d'évaluation des enfants.

par exemple: le résultat que vous retourneriez

['black', 'white'] 
['green', 'red'] 
['blue'] 

un autre exemple:

childParentList = [('car', 'table'), ('wheel', 'chair'), ('floor', 'chair'), ('chair', 'light'), ('chair', 'dark'), ('light', 'car'), ('dark', 'car')] 

génèrerait

['wheel', 'floor'] 
['chair'] 
['dark', 'light'] 
['car'] 
['table'] 
+0

Êtes-vous à la recherche d'un ordre de tri topologique? la façon dont votre question est écrite, cela n'a aucun sens. – DyZ

+0

Pouvez-vous élaborer sur ce que vous entendez par «bon ordre». Ce n'est pas particulièrement clair ce que vous cherchez. –

+0

L'ordre topologique n'est-il pas juste une liste plate? – Michael

Répondre

1

En supposant que vous voulez en effet une sorte topologique, vous pouvez utiliser le module toposort(). Cela nécessite que vos données soient organisées dans un dictionnaire d'ensembles.

import toposort,itertools 
as_dict = {k: set(a[1] for a in v) for k,v 
      in itertools.groupby(sorted(childParentList), key=lambda x: x[0])} 
# {'wheel': {'chair'}, 'chair': {'light', 'dark'}, 'dark': {'car'}, 
# 'car': {'table'}, 'floor': {'chair'}, 'light': {'car'}} 

list(toposort.toposort(as_dict)) 
# [{'table'}, {'car'}, {'light', 'dark'}, {'chair'}, {'wheel', 'floor'}] 
+0

Cela semble très bien, merci! De toute façon pour le faire sans le module toposort? – Michael