所以我写一个函数消耗一个列表来计算其中有多少不同类型的数据,并按整数,浮点数,字符串,布尔值,其他
的顺序返回自然数列表[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;类型。
答案 0 :(得分:3)
{strong>不 type(..)
功能不起作用:构建列表时出现错误。
当编译器/解释器读取代码时,它的目标是根据语言的语法生成抽象语法树。 !
和#
只是无效语法。 #
被解释为注释的开头,因此解释器将显示为:
L = [1, "123", !,
但是,由于!
无效,即使您要移除!
,这也没有任何意义,但Python仍然会抱怨它无法找到匹配的]
(关闭列表)。
现在让我们假设您排除了这一点,还有另一个问题:子类化是什么?例如,可以将str
子类化为子类。你算是str
还是其他?问题更麻烦,因为Python支持多重继承:在{strong>同时,可以是str
和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]
然而,您想要返回没有上下文的列表,并且您只计算特定类型,这很奇怪。我想一个更优雅,更快的解决方案是使用类型生成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)