Python-使用pop编辑列表-Pop超出范围

时间:2018-11-04 23:02:09

标签: python list pop

到目前为止,这是我的代码

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 :(得分:1)

list = [0, 10, 50]
new_list = [item for item in list if isinstance(item, (int, float)) and 50 > item >= 1]

列出对胜利的理解...

单行执行时不需要功能

编辑:

更新后的问题的答案,而无需转换列表中的项目:

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))

丑陋但实用

答案 1 :(得分:0)

pop()删除列表中索引处存在的元素,而不是元素本身。这意味着它接受索引号,而不是元素

答案 2 :(得分:0)

您将要使用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

但这不是很有效,因为remove方法是线性的,因此此滤波器是二次的。相反,您可以按索引删除:

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

答案 3 :(得分:0)

您不想使用在编辑列表边界时使用的东西。

我的意思是

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}}。)

然后应使用类似

的命令检查输入是否为浮点/整数
"-1.2"

所以...就您而言,我愿意

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