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