栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如果存在,如何删除列表中的项目?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果存在,如何删除列表中的项目?

1)几乎是英式风格:

使用

in
操作员测试是否存在,然后应用该
remove
方法。

if thing in some_list: some_list.remove(thing)

remove
方法将仅删除的第一个匹配项
thing
,以便删除您可以
while
代替使用的所有匹配项
if

while thing in some_list: some_list.remove(thing)
  • 足够简单,可能是我的选择。对于小清单(无法抗拒一线)

2)[鸭类型的](http://docs.python.org/glossary.html#term-duck-

typing),EAFP风格:

这种先问后问的态度在Python中很常见。无需预先测试对象是否合适,只需执行操作并捕获相关的Exception:

try:    some_list.remove(thing)except ValueError:    pass # or scream: thing not in some_list!except AttributeError:    call_security("some_list not quacking like a list!")

当然,上面示例中的第二个except子句不仅具有可疑的幽默感,而且完全没有必要(重点是为不熟悉该概念的人演示鸭子式输入法)。

如果您希望事物发生多次:

while True:    try:        some_list.remove(thing)    except ValueError:        break
  • 这个特定用例有点冗长,但在Python中却很惯用。
  • 这比#1表现更好
  • PEP 463为try / except提出了一种较短的语法,用于简单尝试/例外,在这里很方便,但未获批准。

但是,使用contextlib的prevent()contextmanager(在python
3.4中引入),可以将上述代码简化为:

with suppress(ValueError, AttributeError):    some_list.remove(thing)

同样,如果您希望事物发生多次:

with suppress(ValueError):    while True:        some_list.remove(thing)

3)功能风格:

1993年左右,巨蟒有

lambda
reduce()
filter()
map()
,一个礼貌的Lisp黑客谁错过了他们,并提交工作补丁*。您可以用来
filter
从列表中删除元素:

is_not_thing = lambda x: x is not thingcleaned_list = filter(is_not_thing, some_list)

有一个捷径可能对您的情况有用:如果您要过滤出空项目(实际上

bool(item) ==False
None
零,空字符串或其他空集​​合等项目),则可以将None作为第一个参数传递:

cleaned_list = filter(None, some_list)
  • [update] :在Python 2.x中,
    filter(function, iterable)
    曾经等价于
    [item for item in iterable if function(item)]
    (或
    [item for item in iterable if item]
    第一个参数为
    None
    );在Python 3.x中,它现在等效于
    (item for item in iterable if function(item))
    。细微的差别是过滤器用于返回列表,现在它就像生成器表达式一样工作-如果仅遍历清理后的列表并将其丢弃,则可以,但是如果您确实需要列表,则必须将
    filter()
    调用括起来与
    list()
    构造函数。
  • *这些Lispy风格的构造在Python中被认为有点陌生。2005年左右,圭多甚至被谈论下降
    filter
    -与同伴一起
    map
    reduce
    (他们还没有消失,但
    reduce
    被转移到functools模块,这是值得一试,如果你喜欢高阶函数)。

4)数学风格:

自PEP
202
在2.0版中引入列表理解以来,列表理解成为Python中列表处理的首选样式。其基本原理是,列表推导提供了一种更简洁的方法,可以在当前使用

map()
filter()
和/或嵌套循环的情况下创建列表。

cleaned_list = [ x for x in some_list if x is not thing ]

PEP
289
在版本2.4中引入了生成器表达式。生成器表达式更适合您不需要(或不想)在内存中创建完整列表的情况,例如您只想一次遍历一个元素的情况。如果仅遍历列表,则可以将生成器表达式视为延迟的求值列表理解:

for item in (x for x in some_list if x is not thing):    do_your_thing_with(item)
  • 请参阅GvR的此Python历史博客文章。
  • 此语法的灵感来自于数学中的集构建器符号。
  • Python 3还设置并决定了理解能力。

笔记

  1. 您可能要使用不等式运算符
    !=
    来代替
    is not
    (区别很重要)
  2. 对于暗示要使用列表副本的方法的批评者:与流行的看法相反,生成器表达式并不总是比列表理解更有效-请在抱怨之前进行剖析


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/617642.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号