Как насчет этого: используйте groupby
, чтобы сгруппировать список по ненулевым и нулевым значениям, затем инвертировать каждую из этих групп, затем снова объединить их все вместе.
import itertools
def flip(seq):
return [x for k,v in itertools.groupby(seq, key=bool) for x in reversed(list(v))]
test_cases = (
[1,2,3,4,0,9,8,7,6],
[1,2,0,3,4,0,5,6,0],
[1,2,3]
)
for seq in test_cases:
print("{} flips into {}".format(seq, flip(seq)))
Одним из потенциальных преимуществ этого решения по сравнению с решениями на основе индекса и нарезки является то, что он может работать с входами, которые имеют более одного нуля или вообще не имеют нулей.
Результат:
[1, 2, 3, 4, 0, 9, 8, 7, 6] flips into [4, 3, 2, 1, 0, 6, 7, 8, 9]
[1, 2, 0, 3, 4, 0, 5, 6, 0] flips into [2, 1, 0, 4, 3, 0, 6, 5, 0]
[1, 2, 3] flips into [3, 2, 1]