Jak usunąć element z listy, jeśli pasuje do podłańcucha?Usuwanie pozycji z listy pasującej do podłańcucha - Python
Próbowałem usuwanie elementu z listy za pomocą metody pop()
i enumerate
ale wydaje się, że brakuje mi kilku sąsiadujących ze sobą elementów, które muszą być usunięte:
sents = ['@$\tthis sentences needs to be removed', 'this doesnt',
'@$\tthis sentences also needs to be removed',
'@$\tthis sentences must be removed', 'this shouldnt',
'# this needs to be removed', 'this isnt',
'# this must', 'this musnt']
for i, j in enumerate(sents):
if j[0:3] == "@$\t":
sents.pop(i)
continue
if j[0] == "#":
sents.pop(i)
for i in sents:
print i
wyjściowa:
this doesnt
@$ this sentences must be removed
this shouldnt
this isnt
#this should
this musnt
Pożądany wyjściowa:
this doesnt
this shouldnt
this isnt
this musnt
Klasyczny przypadek usuwania elementów z listy podczas iteracji nad tą listą. Przeczytaj dziesiątki innych pytań związanych z przepełnieniem stosu, które odnoszą się do tego. Zobacz także [note in the docs] (http://docs.python.org/reference/compound_stmts.html#for). –
należy zawsze unikać zmiany długości kontenera podczas iteracji przez niego, jest to przepis na katastrofę. – wim
Generalnie zwykle lepiej jest stworzyć nową przefiltrowaną listę niż próbować modyfikować listę w miejscu. Niezmienne algorytmy są zawsze łatwiejsze do zrozumienia (chociaż nie zawsze łatwiej jest wymyślić, jak pisać). Kiedy po prostu wymieniasz wartości, czasami zwiększa się wydajność pracy w miejscu, ale kiedy usuwasz lub wstawiasz na środku listy, zazwyczaj uzyskujesz efektywność i mniej logiczną logikę. – abarnert