我创建了一个函数,它将一个列表作为参数并删除了一个空格或一个数字。代码如下:
def cleaner(List, filter_out=' '):
if filter_out == ' ':
for i in List:
if i == ' ':
List.remove(' ')
if filter_out == 'int':
for i in List:
if type(i) == int:
List.remove(i)
我使用如下列表对其进行了测试:
myList = ['h' ' ', 'g', 1, 2, 3, 4, 5, 'p']
print(cleaner(myList, filter_out='int'))
我希望得到 ['h' ' ', 'g', 'p'] 而是打印出 ['h ', 'g', 2, 4, 'p'] 为什么它会留下 1 和 2?我以为它会过滤掉列表中的所有数字。
请您参考如下方法:
在迭代列表时从列表中删除项目会导致不良后果:
>>> nums = [1, 2, 3, 4]
>>> for x in nums:
... print x
... nums.remove(x)
...
1
3
你从索引 0 开始。你打印 nums[0], 1。然后你删除它。下一个索引是 1。那么,[nums[1] 是 3,因为现在列表是 [2, 3, 4]。您打印它,然后将其删除。该列表现在是 [2, 4],您位于第三个索引处。由于 nums[2] 不存在,循环结束,跳过两个数字。您应该做的是利用内置函数:
myList = ...
myList = filter(lambda x: not isinstance(x, int), myList)
以 ' ' 为例,它将是:
myList = ...
myList = filter(str.strip, myList)
或
myList = filter(lambda x: x != ' ', myList)
注意:Python 3 filter() 函数返回一个filter 对象,而不是一个列表。如果您只是迭代,这会提高效率,但如果您确实需要一个列表,则可以使用 list(filter(...))。
所有这些都制作列表的副本,而不是在原地工作。如果你想要它,使用 myList[:] = ... 而不是 myList = ... (在 filter()线)。请注意,Python 3 filter 对象无需转换为列表即可工作。
