[英]How to get the type of a varible
我创建了一个将列表作为参数的函数,并删除了空格或数字。 代码如下:
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
对象无需转换为列表即可运行。
这将是中型列表的正确方法
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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.