def get_order( _list) :
order = _list[ 0 ]
for sublist in _list[ 1 :] :
if not sublist:
continue
if len ( sublist) == 1 :
if sublist[ 0 ] not in order:
order.append ( sublist[ 0 ] )
continue
new_order = order.copy ( )
for index, value in enumerate ( sublist) :
inserted = False
new_order_index = None
if value in new_order:
new_order_index = new_order.index ( value)
new_order.remove ( value)
for previous_value in sublist[ :index] [ ::-1 ] :
if previous_value in new_order:
insert_index = new_order.index ( previous_value) + 1
print ( 'inserting' , value, 'at position' , insert_index, 'after' , previous_value)
new_order.insert ( insert_index, value)
inserted = True
break
if inserted:
continue
for next_value in sublist[ index:] :
if next_value in new_order:
insert_index = new_order.index ( next_value)
print ( 'inserting' , value, 'at position' , insert_index, 'before' , next_value)
new_order.insert ( insert_index, value)
inserted = True
break
if inserted:
continue
if new_order_index is None :
print ( 'appending' , value)
new_order.append ( value)
else :
print ( 'leaving' , value, 'at position' , new_order_index)
new_order.insert ( new_order_index, value)
order = new_order
return order
print ( get_order( [ [ 1 , 4 ] , [ 2 , 3 ] , [ 3 , 4 ] , [ 1 , 2 ] ] ) )
ZGVmIGdldF9vcmRlcihfbGlzdCk6CiAgICBvcmRlciA9IF9saXN0WzBdCiAgICBmb3Igc3VibGlzdCBpbiBfbGlzdFsxOl06CiAgICAgICAgaWYgbm90IHN1Ymxpc3Q6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgbGVuKHN1Ymxpc3QpID09IDE6CiAgICAgICAgICAgIGlmIHN1Ymxpc3RbMF0gbm90IGluIG9yZGVyOgogICAgICAgICAgICAgICAgb3JkZXIuYXBwZW5kKHN1Ymxpc3RbMF0pCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbmV3X29yZGVyID0gb3JkZXIuY29weSgpCiAgICAgICAgZm9yIGluZGV4LCB2YWx1ZSBpbiBlbnVtZXJhdGUoc3VibGlzdCk6CiAgICAgICAgICAgIGluc2VydGVkID0gRmFsc2UKICAgICAgICAgICAgbmV3X29yZGVyX2luZGV4ID0gTm9uZQogICAgICAgICAgICBpZiB2YWx1ZSBpbiBuZXdfb3JkZXI6CiAgICAgICAgICAgICAgICBuZXdfb3JkZXJfaW5kZXggPSBuZXdfb3JkZXIuaW5kZXgodmFsdWUpCiAgICAgICAgICAgICAgICBuZXdfb3JkZXIucmVtb3ZlKHZhbHVlKQogICAgICAgICAgICBmb3IgcHJldmlvdXNfdmFsdWUgaW4gc3VibGlzdFs6aW5kZXhdWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgcHJldmlvdXNfdmFsdWUgaW4gbmV3X29yZGVyOgogICAgICAgICAgICAgICAgICAgIGluc2VydF9pbmRleCA9IG5ld19vcmRlci5pbmRleChwcmV2aW91c192YWx1ZSkgKyAxCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ2luc2VydGluZycsIHZhbHVlLCAnYXQgcG9zaXRpb24nLCBpbnNlcnRfaW5kZXgsICdhZnRlcicsIHByZXZpb3VzX3ZhbHVlKQogICAgICAgICAgICAgICAgICAgIG5ld19vcmRlci5pbnNlcnQoaW5zZXJ0X2luZGV4LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBpbnNlcnRlZDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZvciBuZXh0X3ZhbHVlIGluIHN1Ymxpc3RbaW5kZXg6XToKICAgICAgICAgICAgICAgIGlmIG5leHRfdmFsdWUgaW4gbmV3X29yZGVyOgogICAgICAgICAgICAgICAgICAgIGluc2VydF9pbmRleCA9IG5ld19vcmRlci5pbmRleChuZXh0X3ZhbHVlKQogICAgICAgICAgICAgICAgICAgIHByaW50KCdpbnNlcnRpbmcnLCB2YWx1ZSwgJ2F0IHBvc2l0aW9uJywgaW5zZXJ0X2luZGV4LCAnYmVmb3JlJywgbmV4dF92YWx1ZSkKICAgICAgICAgICAgICAgICAgICBuZXdfb3JkZXIuaW5zZXJ0KGluc2VydF9pbmRleCwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgaW5zZXJ0ZWQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuZXdfb3JkZXJfaW5kZXggaXMgTm9uZToKICAgICAgICAgICAgICAgIHByaW50KCdhcHBlbmRpbmcnLCB2YWx1ZSkKICAgICAgICAgICAgICAgIG5ld19vcmRlci5hcHBlbmQodmFsdWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgnbGVhdmluZycsIHZhbHVlLCAnYXQgcG9zaXRpb24nLCBuZXdfb3JkZXJfaW5kZXgpCiAgICAgICAgICAgICAgICBuZXdfb3JkZXIuaW5zZXJ0KG5ld19vcmRlcl9pbmRleCwgdmFsdWUpCiAgICAgICAgb3JkZXIgPSBuZXdfb3JkZXIKICAgIHJldHVybiBvcmRlcgoKcHJpbnQoZ2V0X29yZGVyKFtbMSwgNF0sIFsyLCAzXSwgWzMsIDRdLCBbMSwgMl1dKSk=