Python - Редактировать список с помощью pop - Pop вне диапазона - PullRequest
0 голосов
/ 05 ноября 2018

Это мой код

def filter_list2(elements):
    for a in elements:
        if a == (int(a) or float(a)) and a >= 1 and a < 50:
            elements.append(a)
        else:
            elements.pop(a)
    return elements

Я хочу изменить следующий список:

filter_list2([0,10,55])

В это:

[10]

Я знаю, что поп-музыка вне диапазона. Что-то мне не хватает? Как я могу преобразовать мой список в мой результат. Поп - это неправильный подход?

РЕДАКТИРОВАТЬ:

def filter_list2(elements):
    for a in elements:
        if a == (int(a) or float(a)) and a >= 1 and a < 50:
            continue
        else:
            elements.remove(a)
    return elements

Не работает для 'abc'. Как я могу это исправить?

Ответы [ 4 ]

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

Вы не хотите использовать то, что редактирует границы вашего списка, пока вы над ним работаете.

Я имею в виду что-то вроде

for i in myList :
    myList.pop(anything)

ИМХО плохая идея, поскольку i будет принимать все значения list до начала цикла, что может вызвать некоторые проблемы (вне диапазона).

Вы можете предпочесть

tempList = []
for i in range(0,len(myList)) :
    if myList[i] == ... :
        tempList.append(i)

for i in tempList :
    myList.pop(i)

С учетом сказанного, из того, что я понимаю, вы хотите отфильтровать любую строку в списке «вещей» (который может содержать строковые лайки "abc" и числа, отформатированные как строковые лайки "123" или "-1.2".)

Затем следует проверить, является ли ввод float / int, используя что-то вроде

try :
    float(in)
except ValueError :
   #Not a float nor int

Так что ... в вашем случае я бы пошел на

def filter_list2(elements):
    tempList = []
    for i in range(0,elements):
        try :
            temp = float(elements[i])
        except ValueError :
            tempList.append(i)

        if 1.0 <= temp < 50.0:
            continue
        else:
            tempList.append(i)
    for i in tempList :
        elements.pop(i)
    return elements
0 голосов
/ 05 ноября 2018
list = [0, 10, 50]
new_list = [item for item in list if isinstance(item, (int, float)) and 50 > item >= 1]

Понимание списка на победу ...

нет необходимости в функции, когда одна строка будет делать

Edit:

Ответ на обновленный вопрос без преобразования элемента в списке:

def filter_list(my_list):
    new_list = []
    for item in my_list:
        try:
            int(item)
        except ValueError:
            try:
                float(item)
            except ValueError:
                continue
            else:
                if 50 > float(item) >= 1:
                    new_list.append(item)
                else:
                    continue
        else:
            if 50 > int(item) >= 1:
                new_list.append(item)
            else:
                continue
    return new_list

my_list = [0, 10, 50, 'abc', '20', '13.3333']


print(filter_list(my_list))

некрасиво, но функционально

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

Вы захотите использовать remove, который удаляет определенный элемент из списка. Я не уверен, что вы пытаетесь сделать с a == (int(a) or float(a)). Для прямого перевода вы можете использовать:

def filter_list2(elements):
    for a in elements:
        if 1 <= a < 50:
            continue
        else:
            elements.remove(a)
    return elements

Но это не очень эффективно, поскольку метод удаления является линейным, и поэтому этот фильтр является квадратичным. Вместо этого вы можете удалить по индексу:

def filter_list2(elements):
    for n, a in enumerate(elements):
        if not(1 <= a < 50):
            del elements[n]
    return elements

Если вы хотите отфильтровать все строки, вы можете сделать следующее:

def filter_list2(elements):
    for n, a in enumerate(elements):
        if not(1 <= a < 50) or not(isinstance(a, (int, float))):
            del elements[n]
    return elements
0 голосов
/ 05 ноября 2018

pop() удаляет элемент, присутствующий в индексе в списке, а не сам элемент. Это означает, что он принимает индекс, а не элемент

...