Удалить из списка все элементы до указанного (нюанс)
Есть два ньюанса: (1) если в списке нет элемента до которого нужно удалить остальные элементы, то список не должен измениться. (2) если list пустой, то он должен остаться пустым.
def remove_all_before(items: list, border: int) -> Iterable:
if border in items:
for i in range(len(items)):
if items != border:
items.remove(items[i])
a = i
items.remove(items[a])
return items
else:
return items
else:
return items
print((remove_all_before([1, 2, 3, 4, 5], 3))) #[3, 4, 5]
print((remove_all_before([1, 1, 2, 2, 3, 3], 2))) #[2, 2, 3, 3]
print((remove_all_before([1, 1, 2, 4, 2, 3, 4], 2))) #[2, 4, 2, 3, 4]
print((remove_all_before([1, 1, 5, 6, 7], 2))) #[1, 1, 5, 6, 7]
print((remove_all_before([], 0))) #[]
print((remove_all_before([7, 7, 7, 7, 7, 7, 7, 7, 7], 7))) #[7, 7, 7, 7, 7, 7, 7, 7, 7]
Не могу понять как пройти последнюю проверку с семерками, городить бутерброд уже не получается и помогите этот код представить в лямбда выражении (в комментариях справа от print каким должен быть итоговый результат получен)
Ответы (2 шт):
Автор решения: Эникейщик
→ Ссылка
Правило номер 1: никогда нельзя изменять исходный список, нужно создавать новый.
В данном случае вообще нет смысла создавать новый список, потому что можно просто вернуть срез исходного:
def remove_all_before(items: list, border: int):
if border in items:
for i in range(len(items)):
if items[i] == border: # <- нашли border
return items[i:] # <- вернули всё, что после
else: # в этом else нет смысла, потому что если список содержит border,
# то рано или поздно if выполнится
# и до этого else выполнение никогда не дойдет
return items
else:
return items
Автор решения: eri
→ Ссылка
def remove_all_before(items: list, border: int):
try:
return items[items.index(border):]
except ValueError: # нет значения
return items