我创建了一个将列表作为参数并删除了空格或数字的函数。代码如下:
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
?我认为它会过滤掉列表中的所有数字。
答案 0 :(得分:4)
在迭代时从列表中删除项会导致不良后果:
onViewportDragEnd
从索引0开始。您打印onViewportDoubleClick
,onColumnResize
。然后删除它。下一个索引是>>> nums = [1, 2, 3, 4]
>>> for x in nums:
... print x
... nums.remove(x)
...
1
3
。好吧,nums[0]
是1
,因为现在列表是1
。你打印,然后删除它。该列表现在是[nums[1]
,您处于第三个索引。由于3
不存在,循环结束,跳过两个数字。你应该做的是利用内置函数:
[2, 3, 4]
对于[2, 4]
的示例,它将是:
nums[2]
或
myList = ...
myList = filter(lambda x: not isinstance(x, int), myList)
注意:Python 3 ' '
函数返回myList = ...
myList = filter(str.strip, myList)
对象,而不是列表。如果你只是迭代它会使效率更高,但如果你真的需要一个列表,你可以使用myList = filter(lambda x: x != ' ', myList)
。
所有这些都是列表的副本而不是他们的工作。如果您需要,请使用filter()
代替filter
(在list(filter(...))
行中)。请注意,不需要将Python 3 myList[:] = ...
对象转换为列表以使其生效。
答案 1 :(得分:1)
对于中等大小的列表来说,这是一种正确的方法
def cleaner(lst,filter_item = ' '):
if filter_item == ' ':
for i in list(lst):
if i == ' ':
lst.remove(' ')
elif filter_item == 'int':
for i in list(lst):
if type(i) == int:
lst.remove(i)
myList = ['h' ' ', 'g', 1, 2, 3, 4, 5, 'p']
cleaner(myList, 'int')
print(myList)
或更好的方式:
def cleaner(lst,filter_item = ' '):
retval = None
if filter_item == ' ':
retval = [i for i in lst if i != ' ']
elif filter_item == 'int':
retval = [i for i in lst if type(i) != int]
return retval
myList = ['h' ' ', 'g', 1, 2, 3, 4, 5, 'p']
a=cleaner(myList)
print(a)
#['h ', 'g', 1, 2, 3, 4, 5, 'p']
a=cleaner(myList,'int')
print(a)
#['h ', 'g', 'p']