Изменение списка элементов по индикатору - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть список, содержащий:

[1,2,3,4,0,9,8,7,6]

и я хочу изменить значения в списке, основываясь на показателе «0» в списке. Следовательно, для элементов перед '0' я хочу, чтобы они были обращены. и элемент после '0' следует, что получит меня:

[4,3,2,1,0,6,7,8,9]

Я попытался использовать список [:: - 1], но он не работает, если бы я подготовил его на основе этого индикатора. Был бы признателен за помощь в этом.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Как насчет этого: используйте 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]
0 голосов
/ 10 сентября 2018

просто разделить в соответствии с положением 0, затем перевернуть обе части, собрать заново:

lst = [1,2,3,4,0,9,8,7,6]
zidx = lst.index(0)
result = lst[zidx-1::-1] + [0] + lst[:zidx:-1]

результат:

[4, 3, 2, 1, 0, 6, 7, 8, 9]

(предварительная настройка нарезки занимает некоторое время с обратным +нарезка, но это позволяет избежать создания слишком большого количества временных списков)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...