Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Удалить элементы списка по условию

#python #list #список


Есть список 

lst = [0, 95, 0, 76, 0, 23, 68, 0, 23, 156, 95]


Требуется удалить каждый элемент, следующий за 0

чтобы получить на выходе:

new_lst = [0,0,0,68,0,156,95]


Метод str.index() не помогает мне, так как возвращает только первое совпадение, а
c enumerate пока не получается.
    


Ответы

Ответ 1



lst = [0, 95, 0, 76, 0, 23, 68, 0, 23, 156, 95] # Поскольку перед первым элементом # нет ничего (и нуля в том числе, что соответствует условию), # то он добавляется в любом случае. # К тому-же при i == 0, i - 1 == -1 исключения не будет, # так-как элемент с индексом -1 присутствует в списке, # это последний элемент списка # Через цикл new_list = [] for i in range(len(lst)): if i == 0 or lst[i - 1] != 0: new_list.append(lst[i]) print(new_list) # Через генератор print([lst[i] for i in range(len(lst)) if i == 0 or lst[i - 1] != 0])

Ответ 2



Ещё одно решение: res = lst[:1] + [b for a,b in zip(lst, lst[1:]) if a] print(res) # [0, 0, 0, 68, 0, 156, 95] @АндрейNOP предложил более лаконичный и более изящный вариант: res = [b for a,b in zip([1] + lst, lst) if a]

Ответ 3



Из-за костыля с первым элементом не хотел писать ответ, но стало интересно, сможет ли кто-нибудь подсказать более изящное решение from itertools import tee def pairwise(iterable): a, b = tee(iterable) next(b, None) return zip(a, b) lst = [0, 95, 0, 76, 0, 23, 68, 0, 23, 156, 95] new_lst = [j for i, j in pairwise([None] + lst) if i != 0]

Ответ 4



Вот еще один вариант решения, для коллекции: Update - обернул в try, чтобы отлавливать исключение StopIteration lst = [0, 95, 0, 76, 0, 23, 68, 0, 23, 156, 95] seq = iter(lst) newlst=[] try: for _ in seq: newlst.append(_) if _==0: next(seq) except StopIteration: pass print(newlst)

Ответ 5



lst = [0, 95, 0, 76, 0, 23, 68, 0, 23, 156, 95] def cut_after_zero(lst): index = 0 while True: try: index = lst[:-1].index(0, index) except ValueError: return lst index += 1 lst.pop(index) print(cut_after_zero(lst)) # [0, 0, 0, 68, 0, 156, 95]

Ответ 6



Без библиотек и итераторов, с забытым циклом while True: lst = [0, 95, 0, 76, 0, 23, 68, 0, 23, 156, 95] zeros = 0 while True: try: zeros = lst.index(0,zeros)+1 lst.pop(zeros) except: break а также без создания новых списков... )) Только сча увидел, что есть похожее решение. Но - мое понятнее мне и короче.

Ответ 7



Вы можете запоминать порядковый номер элемента в списке, и работать с ним. Например вот так: list = [0, 95, 0, 76, 0, 23, 68, 0, 23, 156, 95] new_list = [] index = 0 for x in list: if list[index-1] != 0: new_list.append(x) index += 1 print(new_list)

Комментариев нет:

Отправить комментарий