如何获得变量的类型

时间:2016-07-29 01:18:36

标签: 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) == 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?我认为它会过滤掉列表中的所有数字。

2 个答案:

答案 0 :(得分:4)

在迭代时从列表中删除项会导致不良后果:

onViewportDragEnd

从索引0开始。您打印onViewportDoubleClickonColumnResize。然后删除它。下一个索引是>>> 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']