【问题标题】:How to get the type of a varible如何获取变量的类型
【发布时间】:2016-12-03 14:18:41
【问题描述】:

我创建了一个将列表作为参数并删除空格或数字的函数。代码如下:

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?我以为它会过滤掉列表中的所有数字。

【问题讨论】:

  • 首先不要使用内置类型名称作为变量或参数
  • 第二件事是你在迭代时没有从列表中删除的第二件事
  • 打印应该不打印
  • @Marko 我们会知道的,但我认为我写的 type(i) 应该将其与内置类型 int 进行比较

标签: python list function types


【解决方案1】:

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

>>> 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 对象转换为列表即可。

【讨论】:

  • 在 Python 3 中,过滤器函数将返回一个生成器对象而不是一个列表。这避免了构建一个完整的结果列表,并且如果您对结果所做的所有事情都是对其进行迭代,则不会有任何区别。如果您需要 Python 3 中的实际列表对象,请使用 myList = list(filter(lambda x: x != ' ', myList))
【解决方案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']

【讨论】:

  • filter不是python中保留的内置函数吗?
  • @Marco 嗯.. 令人惊讶。您的代码似乎仍然可以正常工作:)
  • @Mr.Python 危险的是,您可以覆盖 python 中的内置函数。所以它工作正常,因为默认的filter 已被函数的参数定义覆盖
  • 是的 :) 这正是我想对他说的
  • @xgord 哦,相信我,我非常清楚使用内置函数或关键字作为变量是一个危险的想法。我只是惊讶于 Marko 的代码没有严重失败。
猜你喜欢
  • 2012-07-03
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多