簡體   English   中英

功能僅檢查1個列表項

[英]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"是鍵入的字符串,而您希望它們是布爾值。 因此, TrueFalse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM