【问题标题】:Function to check whether all the element in a list are numbers检查列表中的所有元素是否都是数字的函数
【发布时间】:2021-12-27 17:30:34
【问题描述】:

我需要一个函数来检查输入列表是否全部由数字组成。我知道其他解决方案,但我正在寻找的是有点不同。该函数的输入是使用 *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

【问题讨论】:

  • 创建类有什么意义?
  • CheckNumbersType([1, 2, 3], ["a", "b", "c"]) 怎么样?还是不会出现?
  • @balderman 因为我想定义三种方法。 isfloat、isinteger 和 isnumber
  • @Stuart 也是

标签: python list class tuples


【解决方案1】:

您不需要对每个项目都使用 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

【讨论】:

    【解决方案2】:

    你可以试试:

    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 元组
      • 如果 args[0] 不是列表,则将其“投射”到列表中,否则将其保留为
    • 在 try 结构中循环,以测试每个元素是否可以转换为浮点数(整数转换为浮点数)

    【讨论】:

      【解决方案3】:

      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
        

      【讨论】:

        【解决方案4】:

        使用递归通常是处理列表的好方法,尤其是当您可能还有列表时。您应该将其定义为一个单独的函数,它接受一个参数。如果您在类中需要它,则只需从类方法中调用此函数,然后您可以使用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
            
        

        【讨论】:

          猜你喜欢
          • 2019-12-22
          • 2015-10-03
          • 2020-06-25
          • 2015-01-08
          • 2021-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-07
          相关资源
          最近更新 更多