使用循环删除列表中不满足特定条件的元素
Delete element in a list that do not meet certain conditions using a loop
在读取列表时'lst',我想删除一个不符合特定条件的元素。基于以下答案:Strange result when removing item from a list while iterating over it 我找到了一个非常有效的解决方案。这是 PyCharm 中的代码:
for ind, el in enumerate(lst):
if not el.strip() or el.strip() != 'LABEL':
lst[ind] = None # here I get a warning concerning ind
else:
break
lst = [n for n in lst if n is not None]
我不明白为什么会收到此警告:
Unexpected type(s): (int, None) Possible type(s): (SupportsIndex, str) (slice, Iterable[str])
Inspection info:
Reports type errors in function call expressions, targets, and return values. In a dynamically typed language, this is possible in a limited number of cases.
Types of function parameters can be specified in docstrings or in Python 3 function annotations.
我们看不到代码的其余部分,但您可能对 lst
进行了类型提示,使其只有 str
个元素,而 None
不是 str
.
虽然您不必实施 2-pass 算法来删除元素。以下应该等同于您的代码,没有警告(请参阅 docs for dropwhile
):
from itertools import dropwhile
lst = list(dropwhile(lambda el: el.strip() != 'LABEL', lst))
您可以使用列表理解并在一行中完成所有操作。请看下面的代码:
new_list = [x for x in lst if x.strip() != 'LABEL']
还有一件事,我不认为在循环遍历列表时修改列表是个好主意。
在读取列表时'lst',我想删除一个不符合特定条件的元素。基于以下答案:Strange result when removing item from a list while iterating over it 我找到了一个非常有效的解决方案。这是 PyCharm 中的代码:
for ind, el in enumerate(lst):
if not el.strip() or el.strip() != 'LABEL':
lst[ind] = None # here I get a warning concerning ind
else:
break
lst = [n for n in lst if n is not None]
我不明白为什么会收到此警告:
Unexpected type(s): (int, None) Possible type(s): (SupportsIndex, str) (slice, Iterable[str])
Inspection info:
Reports type errors in function call expressions, targets, and return values. In a dynamically typed language, this is possible in a limited number of cases.
Types of function parameters can be specified in docstrings or in Python 3 function annotations.
我们看不到代码的其余部分,但您可能对 lst
进行了类型提示,使其只有 str
个元素,而 None
不是 str
.
虽然您不必实施 2-pass 算法来删除元素。以下应该等同于您的代码,没有警告(请参阅 docs for dropwhile
):
from itertools import dropwhile
lst = list(dropwhile(lambda el: el.strip() != 'LABEL', lst))
您可以使用列表理解并在一行中完成所有操作。请看下面的代码:
new_list = [x for x in lst if x.strip() != 'LABEL']
还有一件事,我不认为在循环遍历列表时修改列表是个好主意。