Один потенциальный подход, который кажется интуитивно понятным: сначала отсортируйте все как обычно, а затем создайте группы или цепочки, в которых элементы являются идеальным префиксом слева направо. Используя groupby, мы можем решить эту проблему следующим образом.
from itertools import groupby
from operator import itemgetter
def weird_sorting(list_):
"""designed to sort lexically, except when
a string is a complete prefix of another, in which case
the order is reversed
"""
# sort everything lexically
temp = sorted(list_)
# get a grouper that indicates
# True if current string starts with the previous string
grouper = [False] + [r.startswith(l) for l, r in zip(temp, temp[1:])]
output = []
# Group items in the grouper key,
# and reverse all items that have a True group, making sure to
# handle the "very first" string that is starting a True chain
for k, group in groupby(zip(grouper, temp), key=itemgetter(0)):
items = [v for k, v in group]
if k:
prev_item = output.pop()
reversed_list = [prev_item, *items][::-1]
output.extend(reversed_list)
else:
output.extend(items)
return output
test1 = ['test', 'testtube']
print(weird_sorting(test1))
test2 = ['bank', 'ant', 'testtube', 'test']
print(weird_sorting(test2))
test3 = ['bank', 'ant', 'testtube', 'test', 'testtubebabies', 'zeta1', 'zeta11', 'zz']
print(weird_sorting(test3))
Выходы:
['testtube', 'test']
['ant', 'bank', 'testtube', 'test']
['ant', 'bank', 'testtubebabies', 'testtube', 'test', 'zeta11', 'zeta1', 'zz']