Python 如何获取变量的类型
我创建了一个函数,将列表作为参数,并删除了空格或数字。代码如下:Python 如何获取变量的类型,python,list,function,types,Python,List,Function,Types,我创建了一个函数,将列表作为参数,并删除了空格或数字。代码如下: 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) =
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
?我认为它会过滤掉列表中的所有数字。这是一种适合中等规模列表的方法
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']
对于中等规模的列表,这将是一种适当的方法
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']
迭代列表时从列表中删除项目会导致不良后果:
>>> 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)
或
注意:Python 3filter()
函数返回一个filter
对象,而不是一个列表。如果您只是在迭代,那么它会更有效,但是如果您确实需要一个列表,您可以使用list(filter(…)
所有这些文件都是列表的副本,而不是将它们的工作放在适当的位置。如果您希望将其放在适当的位置,请使用
myList[:]=…
而不是myList=…
(在filter()
行中)。请注意,Python 3筛选器对象不需要转换为列表才能正常工作。在迭代列表时从列表中删除项目会导致不良后果:
>>> 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)
或
注意:Python 3filter()
函数返回一个filter
对象,而不是一个列表。如果您只是在迭代,那么它会更有效,但是如果您确实需要一个列表,您可以使用list(filter(…)
所有这些文件都是列表的副本,而不是将它们的工作放在适当的位置。如果您希望将其放在适当的位置,请使用myList[:]=…
而不是myList=…
(在filter()
行中)。请注意,Python3过滤器
对象不需要转换为列表才能正常工作。首先,您不使用内置类型名称作为变量或参数;其次,在迭代时,您不从列表中删除打印应打印的内容none@Marko我们会知道的,但我觉得我写的type(i)
我应该将其与内置类型进行比较int
首先,您不使用内置类型名称作为变量或参数;其次,在迭代时,您不从列表中删除打印应打印的内容none@Marko我们会知道的,但我认为我写的type(I)就是这种感觉
我应该将其与内置类型int
进行比较filter
是否是python中保留的内置函数?@Marco-hmm。令人惊讶的是,您的代码似乎仍然可以正常工作:)@Mr.python危险的是,您可以覆盖python中的内置函数。因此,它可以正常工作,因为默认的过滤器已被覆盖根据函数的参数定义,这正是我想说的him@xgord哦,相信我,我很清楚使用内置函数或关键字作为变量是一个危险的想法。我只是惊讶于Marko的代码没有严重失败。在python中,filter
不是一个保留的内置函数吗?@Marco-hmm。令人惊讶的是我们的代码似乎仍然可以正常工作:)@Mr.Python危险的是,您可以覆盖Python中的内置函数。因此,它可以正常工作,因为默认的filter
已被函数的参数定义覆盖(eah:)这正是我想说的him@xgord相信我,我很清楚使用内置函数or关键字作为变量是一个危险的想法。我只是惊讶于Marko的代码没有严重失败。在Python 3中,filter函数将返回一个生成器对象而不是列表。这避免了构建一个完整的结果列表,并且如果您对结果所做的只是对其进行迭代,也不会产生任何影响。如果您需要实际的Python 3中的list对象,使用myList=list(过滤器(lambda x:x!='',myList))
在Python 3中,filter函数将返回一个generator对象而不是list。这避免了构建一个完整的结果列表,并且如果您对结果所做的一切都是对其进行迭代,也不会产生任何影响。如果您在Python 3中需要实际的list对象,请使用myList=list(filter(lambda x:x!='',myList))