1

Is there any pythonic way to sort a unordered list of links into a dependency-sorted list?

Given the following unordered_linked_list:

unordered_linked_list = [
    {id: "DE3", pred: "FE8"}, 
    {id: "FE8", pred: None}, 
    {id: "79E", pred: "DE3"}, 
    {id: "52D", pred: "79E"},
    ...
]

Which should result in

ordered_list = ["FE8", "DE3", "79E", "52D"]
yurib
  • 8,043
  • 3
  • 30
  • 55
sonix
  • 243
  • 2
  • 17

2 Answers2

2

in general, sorting dependencies is done with topological sort. however, this specific case is simple enough (exactly one incoming and outgoing edge for each item) that full topological sort isn't required.

instead of a linked list, what you have is a list of links. so just restructure it in to something that resembles a linked list and traverse it:

# transform into a source:target dictionary
links = {d['pred'] if d['pred'] else 'root':d['id'] for d in unordered_linked_list}

# follow links and print
source = 'root'
while source in links:
    print links[source]
    source = links[source]
yurib
  • 8,043
  • 3
  • 30
  • 55
1

Try this:

unordered_linked_list = [
    {'id': "DE3", 'pred': "FE8"}, 
    {'id': "FE8", 'pred': None}, 
    {'id': "79E", 'pred': "DE3"}, 
    {'id': "52D", 'pred': "79E"},
]

def traverse(links):
    preds = dict()
    for item in links:
        preds[item['pred']] = item['id']
    item = None
    items = []
    while item in preds:
        item = preds[item]
        items.append(item)
    return items

>>> traverse(unordered_linked_list)
['FE8', 'DE3', '79E', '52D']
John Coleman
  • 51,337
  • 7
  • 54
  • 119