功能仅检查1个列表项

时间:2018-11-04 17:29:49

标签: python list

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],我不想。

2 个答案:

答案 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"是字符串类型,而您希望它们是布尔值。因此是TrueFalse