def get_chain(d):
nodes = {}
# create linked list nodes
for name, (end, start) in d.items():
nodes[start] = [name, (start, end), None]
# build the linked list by looking up other nodes
for node in list(nodes.values()):
start, end = node[1]
node[2] = nodes.pop(end, None)
# there should be only a single node left in nodes
head = next(iter(nodes.values()), None)
# yield out the chain values
while head is not None:
start, end = head[1]
yield start
# if last node, yield the end value
if head[2] is None:
yield end
head = head[2]
print(list(get_chain({
'A': ['tg', 17],
'B': [59, 60],
'C': [60, 61],
'D': [57, 'tt'],
'E': [61, 'tg'],
'F': ['tt', 59]
})))
ZGVmIGdldF9jaGFpbihkKToKCW5vZGVzID0ge30KCSMgY3JlYXRlIGxpbmtlZCBsaXN0IG5vZGVzCglmb3IgbmFtZSwgKGVuZCwgc3RhcnQpIGluIGQuaXRlbXMoKToKCQlub2Rlc1tzdGFydF0gPSBbbmFtZSwgKHN0YXJ0LCBlbmQpLCBOb25lXQoJCQoJIyBidWlsZCB0aGUgbGlua2VkIGxpc3QgYnkgbG9va2luZyB1cCBvdGhlciBub2RlcwoJZm9yIG5vZGUgaW4gbGlzdChub2Rlcy52YWx1ZXMoKSk6CgkJc3RhcnQsIGVuZCA9IG5vZGVbMV0KCQlub2RlWzJdID0gbm9kZXMucG9wKGVuZCwgTm9uZSkKCQoJIyB0aGVyZSBzaG91bGQgYmUgb25seSBhIHNpbmdsZSBub2RlIGxlZnQgaW4gbm9kZXMKCWhlYWQgPSBuZXh0KGl0ZXIobm9kZXMudmFsdWVzKCkpLCBOb25lKQoJCgkjIHlpZWxkIG91dCB0aGUgY2hhaW4gdmFsdWVzCgl3aGlsZSBoZWFkIGlzIG5vdCBOb25lOgoJCXN0YXJ0LCBlbmQgPSBoZWFkWzFdCgkJeWllbGQgc3RhcnQKCQkjIGlmIGxhc3Qgbm9kZSwgeWllbGQgdGhlIGVuZCB2YWx1ZQoJCWlmIGhlYWRbMl0gaXMgTm9uZToKCQkJeWllbGQgZW5kCgkJaGVhZCA9IGhlYWRbMl0KCnByaW50KGxpc3QoZ2V0X2NoYWluKHsKCSdBJzogWyd0ZycsIDE3XSwgCgknQic6IFs1OSwgNjBdLCAKCSdDJzogWzYwLCA2MV0sIAoJJ0QnOiBbNTcsICd0dCddLCAKCSdFJzogWzYxLCAndGcnXSwgCgknRic6IFsndHQnLCA1OV0KfSkpKQ==