2017-06-14 111 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)