【问题标题】: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)的方法来做到这一点?

【问题讨论】:

标签: python list int


【解决方案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 内置函数也可以完成相同的任务,有些人可能会认为它更有意义(参见 Dragananswer

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() 的众多解决方案中的一种可能

          【讨论】:

          • 这会在内存中创建另一个列表,如果列表很大,这可能会非常有问题。最好使用生成器表达式。
          猜你喜欢
          • 2011-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-30
          • 1970-01-01
          • 2017-08-06
          • 2017-02-10
          相关资源
          最近更新 更多