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],我不想。
答案 0 :(得分:0)
您返回"false"
太早了,因为您总是从第一次迭代中返回。另外,您的类型检查is not a type check at all会为大多数任意输入引发错误。请改用isinstance
。此外,Python允许chained comparisons。您可以做例如
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
或更短,使用list comprehension:
def filter_list(elements):
return [a for a in elements if isinstance(a, int) and 1 <= a < 50]
答案 1 :(得分:-1)
由于函数的名称,我将建议另一种方法:使用here。
基本上,您必须实现一个函数,在单个项目上返回布尔值。然后,使用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
。