python内置函数类型()

时间:2017-06-14 09:50:17

标签: python

所以我写一个函数消耗一个列表来计算其中有多少不同类型的数据,并按整数,浮点数,字符串,布尔值,其他

的顺序返回自然数列表
[integer, float, string, Boolean, others]
例如,

L = [1, "123", !, #, 2.0, True, False, [1,2]] 

然后funcition(L)将返回

[1, 1, 1, 2, 3]

我选择内置函数type()来确定数据类型 例如

type(L[0]) == type(9) 

然后我知道列表的第一个元素是否是整数。 但是当列表包含一些符号,如"!@#$%^",那么type()函数 它不再起作用了,它会显示

Syntax Error: invalid syntax: <string>

所以我想知道是否有另一种方法可以对符号进行分类并将其放入&#34;其他&#34;类型。

3 个答案:

答案 0 :(得分:3)

{strong>不 type(..)功能不起作用:构建列表时出现错误

当编译器/解释器读取代码时,它的目标是根据语言的语法生成抽象语法树!#只是无效语法#被解释为注释的开头,因此解释器将显示为:

L = [1, "123", !, 

但是,由于!无效,即使您要移除!,这也没有任何意义,但Python仍然会抱怨它无法找到匹配的](关闭列表)。

现在让我们假设您排除了这一点,还有另一个问题:子类化是什么?例如,可以将str子类化为子类。你算是str还是其他?问题更麻烦,因为Python支持多重继承:在{strong>同时,可以是strbool。假设我们只计算实数str而不是子类,那么我们可以编写以下代码:

def count_types(data):
    the_types = [int,float,str,bool]
    result = [0]*(len(the_types)+1)
    for x in data:
        tyx = type(x)
        for idx,ty in enumerate(the_types):
            if tyx is ty:
                result[idx] += 1
                break
        else:
            result[-1] += 1
    return result

这会产生:

>>> count_types([1, "123", 2.0, True, False, [1,2]])
[1, 1, 1, 2, 1]

然而,您想要返回没有上下文的列表,并且您只计算特定类型,这很奇怪。我想一个更优雅,更快的解决方案是使用类型生成Counter

from collections import Counter

result = Counter(type(x) for x in data)

这会产生:

>>> Counter(type(x) for x in data)
Counter({<class 'bool'>: 2, <class 'list'>: 1, <class 'str'>: 1, <class 'float'>: 1, <class 'int'>: 1})

答案 1 :(得分:2)

如果你想比较类型(即使它不是Pythonic方式)你需要使用isinstance()

 isinstance(L[0], type(9))

 isinstance(L[0], str)

答案 2 :(得分:1)

您可以使用字典计算类型,然后使用operator.itemgetter()根据预期的顺序获得所需的结果:

In [32]: order = [int, float, str, bool, 'other']

In [33]: l = [1, 3, 5.6, 'st', True, 'gg', False, None, lambda x: 3, sum]

In [34]: from collections import defaultdict

In [35]: from operator import itemgetter

In [36]: d = defaultdict(int)                    

In [37]: for i in l:                             
             t = type(i)
             if t in order:
               d[t] += 1
             else:
               d['other'] += 1
   ....:             

In [38]: itemgetter(*order)(d)                    
Out[38]: (2, 1, 2, 2, 3)