Mad*_*sen 2 python filter python-3.x
我正在尝试从列表中过滤字符串。任务是:
创建一个函数,该函数接受一个非负数和字符串列表,并返回一个没有字符串的新列表。
这是我的代码:
def filter_list(lst):
    intlist = []
    while len(lst) > 0:
        if isinstance(lst[0],int):
            if lst[0] >= 0
                intlist.append(lst[0])
                lst.remove(lst[0])
            else:
                lst.remove(lst[0])
        if isinstance(lst[0],str):
            lst.remove(lst[0])
    return (intlist)
它给了我一个错误,似乎我陷入了无限的 while 循环中,尽管我不明白是怎么回事,因为我逐渐从列表中删除了项目,当列表为空时循环结束。
撇开语法错误不谈,您的代码似乎可以正常工作。但是这种设计是非常值得怀疑的,因为它remove是一个线性操作(整个列表需要向前移动以填补元素 0 空出的空白),对于一个应该是 O(n) 的算法来说,整体复杂度为 O(n 2 ) .
多个嵌套条件会导致认知过载,应避免。
当有负数和/或非str/时它也会失败int元素。
没有理由改变输入列表;该函数应该是非幂等的,也就是说,当使用相同的输入多次调用时,总是产生相同的结果。
使用列表推导式处理所有这些问题基本上是自动的:
>>> lst = [42, 15, "foo", "bar", 33, "baz"]
>>> [x for x in lst if isinstance(x, int)]
[42, 15, 33]
或者,如果您预计其他非整数值,更可靠的可能是:
>>> [x for x in lst if not isinstance(x, str)]
[42, 15, 33]
话虽如此,一般来说,我不建议在 Python 中编写面向类型的逻辑。组合列表中的类型并编写分支以根据其类型不同地处理每个项目通常表明设计缺陷,尽管我理解这可能是一个人为的练习。
此外,既然我们有一个单行代码,就没有理由在函数中使用它。调用该函数filter_list只会混淆逻辑,而不会向调用者提供明确的名称、描述或合同,以确定究竟过滤了什么。最好在调用者的任何地方内联逻辑。如果必须将其保留为函数,请考虑使用类似的标头filter_by_type(lst, type_to_keep)并使用filter_by_type(lst, int).
| 归档时间: | 
 | 
| 查看次数: | 610 次 | 
| 最近记录: |