如何测试“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
>>> 

【讨论】:

如果生成器表达式是唯一的参数,则双括号是可选的。 +1 all 函数比 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”类型列表中的每个项目是不是?的主要内容,如果未能解决你的问题,请参考以下文章

如何改进评估列表以确定它是不是包含特定连续项目的方法?

布尔列表检查列表中的每个项目是不是为假

如何从firestore中检索swiftUI中的预定义项目列表?

在 Spock 中的项目列表上断言

RxJava2。对列表中的每个项目执行请求

检查列表的所有元素是不是属于同一类型