[英]Function only checks 1 list entry
def filter_list(elements):
data = [elements]
for a in elements:
if a == (int(a) or float(a)) and a >= 1 and a < 50:
return "true"
else:
return "false"
filter_list([1, 2, 3])
filter_list([0, 2, 3])
filter_list([1, 50, 3])
此函數搜索列表中的int或float值在1到50之間。 但它僅搜索第一個列表項。 如何擴展整個列表的搜索范圍? 另外,如果我在列表中寫1.1,結果將為False。
filter_list([1, 2, 3]) = True
filter_list([0, 2, 3]) = False
filter_list([1, 50, 3]) = True (which should be False)
filter_list([1.1, 2, 3]) = False (which should be True)
編輯:
def filter_list(elements):
data = [elements]
for a in elements:
if a == int(a) and a >= 1 and a < 50:
filter = []
filter.append(a)
return filter
filter_list([2, 1, 4, 5, 6])
結果是[6],我不想。
您總是返回"false"
為時過早,因為您總是從第一次迭代中返回。 同樣,您的類型檢查根本不是類型檢查,並且對於大多數任意輸入都會引發錯誤。 改用isinstance
。 而且,Python允許鏈式比較 。 你可以做例如
def filter_list(elements):
for a in elements:
if isinstance(a, (int, float)) and 1 <= a < 50:
return True # probably, you want to return a bool value
# only now that you have checked all elements, you can know for sure
return False
或更短一點,使用any
:
def filter_list(elements):
return any(isinstance(a, (int, float)) and 1 <= a < 50 for a in elements)
要編譯匹配值的新列表,請執行以下操作:
def filter_list(elements):
# instantiate the new list before the loop
fil = [] # do not shadow the built-in filter function
for a in elements:
if isinstance(a, int) and 1 <= a < 50:
fil.append(a)
return fil
或更短一點,使用列表推導 :
def filter_list(elements):
return [a for a in elements if isinstance(a, int) and 1 <= a < 50]
由於函數的名稱,我將建議另一種方法:使用reduce 。
基本上,您必須實現一個函數,在單個項目上返回布爾值。 然后,使用reduce
將此功能應用於列表的每個元素。
f = lambda x : 1.0 <= x < 50
# Is equivalent to
def f(item):
return 1.0 <= item < 50
然后應用於您的列表:
print filter(f, [0,1,2])
[1, 2]
應用於您的問題,您應該確保過濾后的列表的大小與原始列表的大小相同(或修改oracle函數以進行相反的操作,並確保結果為空)。
def check(lst):
return len(lst) == len(filter(f, lst))
print check([0,1,2])
# Outputs False
print check([1,2,3])
# Outputs True
另外, "True"
和"False"
是鍵入的字符串,而您希望它們是布爾值。 因此, True
或False
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.