【问题标题】:Completely remove one item from a list [duplicate]从列表中完全删除一项[重复]
【发布时间】:2014-03-10 17:36:35
【问题描述】:

如果我有这样的列表:

MyList = [1,2,3,4,5,'hi', 6,7, 'hi', 8, 'hi', 9]

如何从列表中删除所有“hi”项?我已经尝试过 remove() 方法,但它只工作一次:

MyList.remove('hi')
>>>> MyList
[1,2,3,4,5,6,7,'hi',8,'hi',9]

是的,我可以这样做:

while 'hi' in MyList:
    MyList.remove('hi')

但是有没有人知道比重复 n 次相同的指令更优雅的方法?

【问题讨论】:

    标签: python list


    【解决方案1】:

    while 'hi' in MyList: MyList.remove('hi') 是 O(N**2),最好使用一个简单的列表推导,它在 O(N) 时间做同样的事情:

    MyList = [item for item in MyList if item != 'hi']
    

    【讨论】:

    • 是的,我想通了,这就是为什么我想要一些不同的东西。尽管我对 Python 的了解非常有限,但列表理解不会迭代 O(N**2) 吗?
    • @MatteoNNZ 不,LC 是O(N),您只对列表进行了一次迭代。
    • @Aswhini Chaudhary,真的。那么我将使用列表理解,非常感谢。
    • 不幸的是,我无法设置接受的两个答案,为了正确起见,我会接受 Martjin 的一个,因为它稍早出现并且完全相同。非常感谢您的解决方案和解释。
    • @MatteoNNZ 没问题。 :)
    【解决方案2】:

    使用列表推导:

    MyList = [v for v in MyList if v != 'hi']
    

    这将重建列表以仅包含不等于 'hi' 的值。

    list.remove() 调用必须将剩余的列表项向前移动,而使用列表推导更有效。

    【讨论】:

    • 非常感谢@Martijin Pieters!
    【解决方案3】:

    我猜你可以使用过滤功能。 这是文档:filter docs

    MyList = [1,2,3,4,5,'hi', 6,7, 'hi', 8, 'hi', 9]
    
    def f(item, element="hi"):
        if item == element:
            return False
        else:
            return True
    
    print filter(f, MyList)
    >>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    感谢 Tim Pietzcker 的改进。 f 函数可以更短

    def f(item, element="hi"): return item != element
    

    【讨论】:

    • +1 代表filter(),-1 代表你的函数,应该是def f(item, element="hi"): return item != element。
    • 是的,谢谢,这是一个更好的解决方案
    【解决方案4】:

    你也可以使用生成器表达式:

    NewList = (x for x in MyList if x != 'hi')
    

    然后您可以将其迭代为 NewList.next() 直到它引发 StopIteration。

    【讨论】:

    • "not x == 'hi'" 而不是 "x != 'hi'" ?我建议后者。
    • @Paddy3118 你能告诉我为什么我不应该使用“not x == 'hi'”吗?
    • 嗨@Manjunath,这纯粹是一个主观的风格问题。你说“这是假的”还是“这不是真的”?在 "not x == 'hi'" 中,有两个测试要读:不和相等;在“x!='hi'”的第二种情况下,只有一个:不相等。第二个似乎更直接地传达了它的含义。
    • @Manjunath != 显然比not x == ... 更易读、更简洁,并且在更少的字节码步骤中做同样的事情。如果x 是某个用户定义类的实例,那么它会调用__eq__ 而不是__ne__,请注意在用户定义的类中不一定要有__ne__ == not __ne__ .
    • @Manjunath 这也适用于in 和is 运算符:x not in foo 应该优先于not x in foo,尽管这两个编译为相同的字节码,但在内部是 Python 的窥孔优化器实际上将第二个表达式转换为第一个。
    猜你喜欢
    • 2023-01-17
    • 2017-09-16
    • 2021-01-24
    • 2020-11-09
    • 2011-03-13
    • 2020-03-16
    • 2021-06-01
    • 2014-09-30
    • 2011-01-13
    相关资源
    最近更新 更多