2017-06-14 32 views
0

所以我在写一个函数会消耗一个列表来计算它里面有多少种不同类型的数据,并按照整数,浮点,字符串,布尔,其他的顺序返回一个自然数列表python内置函数类型()

[integer, float, string, Boolean, others] 

例如 让

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

然后funcition(L)将返回

[1, 1, 1, 2, 3] 

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

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

然后我知道如果列表的第一个元素是一个整数。 但是当列表中包含像一些符号“!@#$%^”,那么类型()函数 不工作了,它会显示

Syntax Error: invalid syntax: <string> 

所以我不知道是否有另一种方式来将符号分类并将其放入“其他”类型中。

+5

但是''和''#**都开始与** ... –

+0

不回答你的问题,不是有效的对象,但!如果你想计算类型,为什么不只是'collections.Counter(map(type,L))'? –

回答

3

这是type(..)功能不起作用:构建列表时发生错误。

当编译器/解释器,读取代码,它的目标将是生成根据该语言的语法抽象语法树!#简直是无效文法。该#被解释为注释的开始,所以解释器将读取:

L = [1, "123", !, 

但是,这并没有任何意义或者因为!是无效的,即使你将消除!,那么Python会仍然抱怨它找不到匹配的](关闭列表)。

现在让我们假设你排除了这个问题,还有另外一个问题:的子类是什么?人们可以例如子类str ing。你把它算作str还是其他?这个问题更麻烦,因为Python支持多重继承:东西可以是str ing,bool可以是同时。让我们假设我们只算真正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] 

尽管如此,它是奇怪的,你想返回一个列表没有上下文,此外,你只计算特定类型。我想一个更优雅和更快的解决方案,是产生A型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}) 
2

如果要比较的类型(即使它不是一个Python的方式),你需要使用isinstance()

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

isinstance(L[0], str) 
+0

这会将'True'归类为'int'。我认为在OP的情况下,直接比较类型是更好的选择。无论如何,这与OP的问题无关。 –

+0

然后,OP必须与直接比较,但抽象类。 – vZ10

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)