【问题标题】:How to remove an object from a list in python?如何从python中的列表中删除一个对象?
【发布时间】:2015-10-09 18:18:23
【问题描述】:

我有一个这样的列表:

l = [{'username': u'bob', 'id': 2L, 'email': u'bob@me.com'}, {'username': u'jane', 'id': 3L, 'email': u'jane@me.com'}]

所以我想知道从列表中删除 bob 对象的最佳方法是什么?

我知道如何使用remove() 消除一个元素,但不确定消除整个对象。

【问题讨论】:

  • 消除一个元素和整个对象有什么区别?
  • Python 垃圾收集器是按引用计数的。当范围内没有引用它的变量时,它将删除该对象。
  • @PauloScardine:这应该是我问题的答案吗?列表的每个元素不是一个对象吗?
  • IIUC,您知道如何从列表中删除该项目,但担心会破坏它。 Python 中的每个值都是一个对象,列表中的每个项目都是一个值的引用。将其视为指针。当您从数组中删除一个对象并且没有引用它的变量、数组或对象属性时,该对象将从内存中擦除。大多数时候你不必担心。

标签: python list python-2.7


【解决方案1】:

使用列表推导并过滤掉不需要的对象,像这样

>>> [item for item in l if item['username'] != 'bob']
[{'email': 'jane@me.com', 'username': 'jane', 'id': 3}]

或者你也可以使用filter函数,像这样

>>> filter(lambda item: item['username'] != 'bob', l)
[{'email': 'jane@me.com', 'username': 'jane', 'id': 3}]

注意:这两种方法都会返回一个没有您不想要的项目的新列表。它们不会更改原始对象。

【讨论】:

  • @Jand 列表理解在大多数情况下比 filter 快​​。
  • 这取决于列表的大小和 Python 版本。此外,“更好的性能”取决于您是否关心速度或内存消耗,通常需要权衡取舍。
  • @PauloScardine 我的版本是 2.7。它有什么不同?
  • 是的,确实如此。在 Python 2.x 中,filter(function, iterable) 曾经等同于 [item for item in iterable if function(item)](如果第一个参数是 None,则为 [item for item in iterable if item]);在 Python 3.x 中,它现在等同于 (item for item in iterable if function(item))。细微的区别是过滤器用于返回一个列表,现在它像一个生成器表达式一样工作 - 如果您只是迭代清理过的列表并丢弃它,这是可以的,但是如果您真的需要一个列表,则必须将 @ 括起来987654330@ 在list() 构造函数中调用。
【解决方案2】:

您可以使用列表推导来遍历列表并保留那些用户名值不是bob 的字典:

>>> [_dic for _dic in l if _dic.get('username','')!='bob']
[{'username': u'jane', 'id': 3L, 'email': u'jane@me.com'}]

请注意,使用dict.get,您可以为此方法设置一个默认值,如果您的字典没有键username,则返回它,因此它不会引发KeyError

【讨论】:

    【解决方案3】:

    下面会返回所有用户名不是bob的对象:

    l2 = filter(lambda x: x['username'] != 'bob', l)
    

    现在如果你打印 l2,你会得到:

    [{'email': u'jane@me.com', 'id': 3L, 'username': u'jane'}]
    

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2018-07-08
      • 2012-04-03
      • 2021-07-11
      • 2014-06-29
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2021-05-13
      相关资源
      最近更新 更多