检查列表中的所有元素是否都是数字的函数

Function to check whether all the element in a list are numbers

我需要一个函数来检查输入列表是否全部由数字组成。我知道其他解决方案,但我正在寻找的是有点不同。该函数的输入是一个使用 *args 提供的元组,我需要该函数来处理列表以及数字。此外,它还必须捕获写为字符串的数字。

这意味着它必须适用于以下输入:

 - instance = CheckNumbersType([1,2,3,4,5,...])
 - instance = CheckNumbersType(['1','2','3','4','5',...])
 - instance = CheckNumbersType(1,2,3,4,5,...)
 - instance = CheckNumbersType('1','2','3','4','5',...)

这是我的代码,它可以工作,但我认为它不是很有效,而且对我来说它看起来也有点迂腐。是否有任何图书馆或 oyu 有任何其他想法来避免嵌套所有 if...elsetry...except

class CheckNumbersType:
    def __init__(self, *args):
        self.values = args

    def isfloat(self):
        var = None
        check = True
        for item in self.values:
            if type(item) == list:
                for value in item:
                    try:
                        float(value)
                        var = True
                    except ValueError:
                        var = False
                        print(var)
            else:
                try:
                    float(item)
                    var = True
                except ValueError:
                    var = False

            check = check and var
        return check

使用递归通常是处理列表的好方法,尤其是当您可能还有列表的列表时。您应该将其定义为一个单独的函数,它接受一个参数。如果您在 class 中需要它,则只需从 class 方法中调用此函数,然后您可以使用 is_floats(args) 将参数作为单个参数传递。函数参数在元组中给出,因此允许函数接受元组和列表很方便。

def is_floats(x):
    """ True if x is convertible to a float, or is a list or tuple (or nested list or 
        tuple) of values that are all convertible to floats """
    
    if isinstance(x, (list, tuple)):
        return all(is_floats(item) for item in x)
    try:
        float(x)
        return True
    except ValueError:
        return False
    

3分:

  • 我认为你一旦找到 1 个非浮动元素就可以停止

  • 您可以在处理之前展平输入列表

  • 我仍然认为 try...except 是评估输入是 float 还是 int

    的最佳方式
    from functools import reduce
    
    def flatten(l):
        def func(x): return x if type(x) is list else [x]
        return reduce(lambda x,y:func(x) + func(y), l) 
    
    def is_float(item):
        try:
            float(item)
            return True
        except ValueError:
            return False
    
    def is_float_list(my_list):
        for item in flatten(my_list):
            if not is_float(item):
                return False            
        return True
    
    print(is_float_list([1,2,3,4]))  # returns True
    print(is_float_list([1,2,3,'A'])) # returns False
    print(is_float_list([[1,2,3],['2', 3, '4']])) # returns True
    print(is_float_list([[1,2,3],['2', 3, '4']])) # returns False
    print(is_float_list([[1,2,3],10,['2', 3, '4']])) # returns True
    print(is_float_list([[1,2,3],'A',['2', 3, '4']])) # returns False
    

你可以试试:

def CheckNumbersType(*args):
    l = list(args) if not isinstance(args[0], list) else args[0]
    try:
        for e in l:
            float(e)
    except ValueError:
        return False
    return True

其中:

  • 第一行:
    • *args 是函数参数的元组
    • 如果 args[0] 不是一个列表 'cast' 它到一个列表,否则保持它为
  • 在 try 结构中循环,测试每个元素是否可以转换为浮点数(整数转换为浮点数)

您不需要对每个项目都使用 try/except 结构。只需尝试一步转换整个参数列表。例外情况将同样发生在个别项目上。除了可变参数元组之外,使用递归来处理值列表:

def CheckNumbersType(*numbers):
    try:
        return all(CheckNumbersType(*n) if isinstance(n,list) else [float(n)] 
                   for n in numbers)
    except (ValueError,TypeError):
        return False