Функция только проверяет 1 запись в списке - PullRequest
0 голосов
/ 04 ноября 2018
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 или число в диапазоне от 1 до 50 находятся в списке. Но он ищет только первую запись в списке. Как я могу расширить поиск по всему списку? Также, если я напишу 1.1 в списке, результатом будет Ложь.

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 голосов
/ 04 ноября 2018

Из-за названия вашей функции я предложу другой подход: использование уменьшите .

По сути, вы должны реализовать функцию, возвращающую логическое значение для одного элемента. Затем используйте 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.

0 голосов
/ 04 ноября 2018

Вы возвращаете "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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...