我需要一個函式來檢查輸入串列是否全部由數字組成。我知道其他解決方案,但我正在尋找的有點不同。該函式的輸入是一個使用 *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
uj5u.com熱心網友回復:
使用遞回通常是處理串列的好方法,尤其是在您可能還有串列的情況下。您應該將其定義為接受單個引數的單獨函式。如果您在類中需要它,那么只需從類方法中呼叫此函式,然后您就可以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
uj5u.com熱心網友回復:
3分:
一旦你找到 1 個非浮動元素,我認為你可以停止
您可以在處理之前將輸入串列展平
我仍然認為這
try...except是評估輸入是一個float還是一個的最好方法intfrom 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
uj5u.com熱心網友回復:
你可以試試:
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] 不是串列,則將其“強制轉換”為串列,否則將其保留為
- 在 try 結構中回圈,以測驗每個元素是否可以轉換為浮點數(整數轉換為浮點數)
uj5u.com熱心網友回復:
您不需要在每個專案上使用 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/357929.html
下一篇:控制一個整數值null
