繁体   English   中英

如何获得变量的类型

[英]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']为什么它离开了12 我认为它将过滤掉列表中的所有数字。

迭代时从列表中删除项目会导致严重的后果:

>>> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM