如何测试“int”类型列表中的每个项目是不是?
Posted
技术标签:
【中文标题】如何测试“int”类型列表中的每个项目是不是?【英文标题】:How to test if every item in a list of type 'int'?如何测试“int”类型列表中的每个项目是否? 【发布时间】:2011-08-25 23:01:52 【问题描述】:假设我有一个数字列表。我将如何检查列表中的每个项目都是 int? 我四处搜寻,但找不到任何关于此的东西。
for i in myList:
result=isinstance(i, int)
if result == False:
break
会起作用,但在我看来,它看起来很丑陋且不符合标准。 有没有更好(和更pythonic)的方法来做到这一点?
【问题讨论】:
为什么首先需要检查这个?使用鸭子类型是 pythonic,没有充分理由检查类型不是 - 你有充分的理由吗? 这能回答你的问题吗? Python check if all elements of a list are the same type 【参考方案1】:>>> my_list = [1, 2, 3.25]
>>> all(isinstance(item, int) for item in my_list)
False
>>> other_list = range(3)
>>> all(isinstance(item, int) for item in other_list)
True
>>>
【讨论】:
如果生成器表达式是唯一的参数,则双括号是可选的。 +1all
函数比 any
函数更有意义。 (很确定它们在运行时方面是等效的)
要检查该列表中的每个元素是否为 int,您也可以使用它,这对我来说似乎更容易阅读:all(type(item) is int for item in my_list)
【参考方案2】:
以下语句应该有效。它使用 any
内置函数和生成器表达式:
any(not isinstance(x, int) for x in l)
如果列表中有一个非整数,这将返回 true。例如:
>>> any(not isinstance(x, int) for x in [0,12.])
True
>>> any(not isinstance(x, int) for x in [0,12])
False
all
内置函数也可以完成相同的任务,有些人可能会认为它更有意义(参见 Dragan 的 answer)
all(isinstance(x,int) for x in l)
【讨论】:
我想知道使用 'al'l 或 'any' 哪个更好。当“任何”到达一个匹配的对象时,它会停止迭代还是继续到最后?因为'all'肯定会迭代所有元素,但如果有的话不会。对我来说,最好使用'any'【参考方案3】:一种方法不是测试,而是坚持。这意味着您的程序可以智能地处理更广泛的输入 - 如果有人将浮点数传递给它,它不会失败。
int_list = [int(x) for x in int_list]
或(就地):
for i, n in enumerate(int_list):
int_list[i] = int(n)
如果某些内容无法转换,它将引发异常,如果您愿意,您可以捕获该异常。
【讨论】:
【参考方案4】:In [1]: a = [1,2,3]
In [2]: all(type(item)==int for item in a)
Out[2]: True
【讨论】:
【参考方案5】:发现自己有同样的问题,但在不同的情况下:如果列表中的“整数”表示为字符串(例如,我在一行整数上使用 'line.split()' 后就是这种情况和字符串,同时读取文本文件),而您只是想检查列表中的元素 是否可以表示为为整数,您可以使用:
all(i.isdigit() for i in myList)
例如:
>>> myList=['1', '2', '3', '150', '500', '6']
>>> all(i.isdigit() for i in myList)
True
>>> myList2=['1.5', '2', '3', '150', '500', '6']
>>> all(i.isdigit() for i in myList2)
False
【讨论】:
【参考方案6】:查看函数
def is_int(x):
if type(x) == int:
return True
return
def all_int(a):
for i in a:
if not is_int(i):
return False
return True
然后调用
all_int(my_list) # returns boolean
【讨论】:
【参考方案7】:lst = [1,2,3]
lst2 = [1,2,'3']
list_is_int = lambda lst: [item for item in lst if isinstance(item, int)] == lst
print list_is_int(lst)
print list_is_int(lst2)
suxmac2:~$ python2.6 xx.py
True
False
....使用列表推导或 filter() 的众多解决方案中的一种可能
【讨论】:
这会在内存中创建另一个列表,如果列表很大,这可能会非常有问题。最好使用生成器表达式。以上是关于如何测试“int”类型列表中的每个项目是不是?的主要内容,如果未能解决你的问题,请参考以下文章