提问者:小点点

如何检查以确保列表中的所有项目都是某种类型[重复]


我想强制列表中的所有项目都是< code>x类型。做这件事的最好方法是什么?目前我正在做一个如下的断言:

a = [1,2,3,4,5]
assert len(a) == len([i for i in a if isinstance(i, int)])

其中<code>int</code>是我试图在这里强制执行的类型。有更好的方法吗?


共3个答案

匿名用户

我认为你让它有点太复杂了。你可以只使用 all()

a = [1,2,3,4,5]
assert all(isinstance(i, int) for i in a)

a = [1,2,3,4,5.5]
assert all(isinstance(i, int) for i in a)
# AssertionError

匿名用户

您需要决定是否还对包含int的任何子类感兴趣。如果iTrueFalse,则isinstance(i,int)将返回True。因为boolint的子类。

无论你做什么,你都应该像Mark Meyer建议的那样使用all。(顺便说一下,与使用len相比,这样做的一个优点是,如果有任何测试失败,那么它不会不必要地检查剩下的项目,前提是您使用的是生成器,而不是构建结果列表——事实上,语法中的任何地方都没有使用[]符号,这表明情况就是这样。)

但是如果你只对包含实际的int类型本身感兴趣,那么你应该这样做:

assert all(type(i) is int for i in a)

(如果您确实想允许,例如bool,请参见Mark Meyer的答案。)

匿名用户

在Python中,你需要问问自己是否有必要?通常,您检查进入程序的数据,然后依靠程序结构在其内部分发适当的类型。您可以使用Mypy和类型注释来提供帮助(静态)。您可以将运行时检查设置为可选 - 例如,调试模式的一部分。过去,我不得不进入交互系统的级别,其中用于学习系统的数据检查器随后被关闭,仅用于调试。其他程序可以有成本较低的检查,内部开发将使用检查器,第三方代码可以让检查器在其版本上运行。数据检查需要时间,我必须寻找有效的解决方案。