如果列表中存在某个项目,如何删除该项目?

2023-12-22

我正进入(状态new_tag从表单文本字段self.response.get("new_tag") and selected_tags来自复选框字段

self.response.get_all("selected_tags")

我这样组合它们:

tag_string = new_tag
new_tag_list = f1.striplist(tag_string.split(",") + selected_tags)

(f1.striplist是一个去除列表中字符串内部空格的函数。)

但在这种情况下tag_list为空(没有输入新标签)但是有一些selected_tags, new_tag_list包含一个空字符串" ".

例如,从logging.info:

new_tag
selected_tags[u'Hello', u'Cool', u'Glam']
new_tag_list[u'', u'Hello', u'Cool', u'Glam']

如何去掉空字符串?

如果列表中有空字符串:

>>> s = [u'', u'Hello', u'Cool', u'Glam']
>>> i = s.index("")
>>> del s[i]
>>> s
[u'Hello', u'Cool', u'Glam']

但如果没有空字符串:

>>> s = [u'Hello', u'Cool', u'Glam']
>>> if s.index(""):
        i = s.index("")
        del s[i]
    else:
        print "new_tag_list has no empty string"

但这给出了:

Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    if new_tag_list.index(""):
        ValueError: list.index(x): x not in list

为什么会发生这种情况,我该如何解决?


1)近乎英式风格:

使用以下命令测试存在性in运算符,然后应用remove method.

if thing in some_list: some_list.remove(thing)

The remove方法将仅删除第一次出现的thing,为了删除所有出现的情况,您可以使用while代替if.

while thing in some_list: some_list.remove(thing)    
  • 足够简单,可能是我的选择。对于小列表(无法抗拒俏皮话)

2) 鸭型 http://docs.python.org/glossary.html#term-duck-typing, EAFP http://docs.python.org/glossary.html#term-eafp style:

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

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 http://www.python.org/dev/peps/pep-0463/提出了一种更短的 try/ except 简单用法语法,这在这里会很方便,但没有被批准。

然而,随着contextlib的suppress()上下文管理器 https://docs.python.org/3/library/contextlib.html#contextlib.suppress(python 3.4中引入)上面的代码可以简化为:

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

同样,如果您预计事情会多次出现:

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

3)功能风格:

1993 年左右,Python 得到了lambda, reduce(), filter() and map(),由Lisp https://en.wikipedia.org/wiki/Lisp_%28programming_language%29错过了它们并提交了工作补丁的黑客*。您可以使用filter从列表中删除元素:

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

有一个快捷方式可能对您的情况有用:如果您想过滤掉空项目(实际上是其中的项目)bool(item) == False, like None、零、空字符串或其他空集​​合),您可以传递 None 作为第一个参数:

cleaned_list = filter(None, some_list)
  • [update]:在Python 2.x中,filter(function, iterable)曾经相当于[item for item in iterable if function(item)] (or [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 http://www.artima.com/weblogs/viewpost.jsp?thread=98196- 与同伴一起map and reduce(他们还没有消失,但是reduce被搬进了功能工具 http://docs.python.org/2/library/functools.html#functools.reduce模块,如果你喜欢的话值得一看高阶函数 http://en.wikipedia.org/wiki/Higher-order_function).

4)数学风格:

列表推导式 http://en.wikipedia.org/wiki/List_comprehension自 2.0 版本引入以来,成为 Python 中列表操作的首选样式PEP 202 http://www.python.org/dev/peps/pep-0202/。其背后的基本原理是列表推导式提供了一种更简洁的方法来在以下情况下创建列表:map() and filter()和/或当前将使用嵌套循环。

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

生成器表达式是在 2.4 版本中引入的PEP 289 http://www.python.org/dev/peps/pep-0289/。生成器表达式更适合您实际上不需要(或想要)在内存中创建完整列表的情况 - 例如当您只想一次迭代一个元素时。如果您仅迭代列表,则可以将生成器表达式视为惰性评估 http://en.wikipedia.org/wiki/Lazy_evaluation列表理解:

for item in (x for x in some_list if x is not thing):
    do_your_thing_with(item)
  • See 这个 Python 历史博客 http://python-history.blogspot.com.br/2010/06/from-list-comprehensions-to-generator.html发帖者GvR http://en.wikipedia.org/wiki/Guido_van_Rossum.
  • 这个语法的灵感来自于集合构建器符号 http://en.wikipedia.org/wiki/Set-builder_notation在数学中。
  • Python 3 也有set http://www.python.org/dev/peps/pep-3100/#id103 and 字典理解 http://www.python.org/dev/peps/pep-0274/.

Notes

  1. 您可能想使用不等式运算符!=代替is not (差异很重要 https://stackoverflow.com/q/2209755/)
  2. 对于暗示列表副本的方法的批评者:与流行的看法相反,生成器表达式并不总是比列表理解更有效 - 请在抱怨之前进行分析
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果列表中存在某个项目,如何删除该项目? 的相关文章

随机推荐

  • Java iText 页脚

    我正在尝试使用 JSP 页面生成 PDF 我的编码大纲如下 Document document new Document PageSize A4 70 Left 70 Right 140 Top 30 Bottom response set
  • Java中如何保证文件的原子移动或异常?

    在我的一个项目中 我对一个 JRE 中的一个文件进行并发写入访问 并且希望通过首先写入临时文件 然后使用原子移动将该临时文件移动到目标来处理该问题 我不关心写入访问的顺序等 我需要保证的是在任何给定时间单个文件都是可用的 我已经知道 Fil
  • 如何将txt文件中的内容复制到剪贴板? [复制]

    这个问题在这里已经有答案了 我的桌面上有一个 txt 文件 test txt 我想打开该 txt 文件并将所有内容复制到剪贴板 我该怎么做 我想出了如何打开文件并读取行 path C Users Username Desktop test
  • Textblob - HTTPError:HTTP 错误 429:请求过多

    我有一个数据框 其中一列的每一行都有一个字符串列表 平均而言 每个列表有 150 个单词 每个单词约 6 个字符 数据帧的 700 行中的每一行都是关于一个文档 每个字符串是该文档的一个单词 所以基本上我已经将文档中的文字标记化了 我想检测
  • 使用图形密集型多点触控应用程序,XNA 还是 WPF?

    我即将开始开发多点触控应用程序 我需要在 WPF 和 XNA 之间做出选择 哪个跑得更快 WPF 已经拥有通过 TUIO 输入支持多点触控的库 有谁知道类似的库 甚至只是示例代码在 XNA 中拖动 旋转 移动对象 谢谢 西南 触摸只是获取用
  • 在 JSch 中使用 ChannelSftp 传输文件夹和子文件夹?

    我想使用 JSch 传输文件夹和子文件夹ChannelSftp 我可以使用成功传输文件channelsftp put src dest 命令但这不适用于文件夹 至少我无法使其工作 那么有人可以解释一下如何使用传输文件夹和子文件夹吗Chann
  • 如何将 Javascript 文件导入 Haml 视图?

    我想在 Haml 视图中包含一些 Javascript 功能 但我不希望将其插入到每个视图中 我是否必须将 Javascript 文件放在 public javascripts 中 还是可以将其放在 app assets javascrip
  • 使用@ViewBuilder创建支持多个子视图的视图

    SwiftUI 中的某些视图 例如 VStack 和 HStack 支持将多个视图作为子视图 如下所示 VStack Text hello Text world 据我收集 他们使用视图生成器 https developer apple co
  • 如何解决重叠轴刻度标签

    我正在研究来自 SDSS 斯隆数字巡天 的数据来绘制和分析恒星的光谱 为此 我从他们的网站下载了一个 csv 文件 从中提取每一行及其数据 然后绘制该数据 数据的格式为波长 通量 最佳拟合 SkyFlux 但我只对波长和最佳拟合真正感兴趣
  • Android模拟器太慢了,无法使用

    我对Android模拟器的体验是它太慢了以至于无法使用 我看到与该问题相关的线索可以追溯到一年多前 对问题缺乏一致的回答是不可接受的 这不是社区的错 问题 有谁经历过速度极其缓慢 启动时间超过 15 分钟 实际解决了这个问题使得启动时间不到
  • 使用 JQuery 将 拖放到段落中

    我需要拖放 span to p 我的代码可以运行 但有 3 个问题 当我编辑时 p p 通过输入内容 假设三个单词 并拖动后 span to span p p 新输入的单词充当一个单词 因此不能在这些新输入的内容之间放置可拖动组件 关闭后
  • “NODE_OPTIONS”未被识别为内部或外部命令 - 仍然是一个问题

    我正在遵循以下指南here https nextjs org docs advanced features debugging在 nextjs 应用程序上 在 Windows 上使用 VSCode 它说使用脚本 dev NODE OPTIO
  • 如何在 Windows 应用商店应用程序 C# 中读取 mp3 文件的每分钟节拍数标签?

    我正在尝试读取嵌入在 mp3 文件中的 bpm 如下所示 我尝试过使用 Windows Storage FileProperties MusicProperties 但它只包含标题 歌手等 它无法读取我之前显示的 bpm 我正在调查http
  • 仅重用 Crystal Reports 刷新时的某些参数?

    我有一个水晶报表 它有两个参数 其中之一由运行报表的 C 应用程序自动设置 但另一个由用户设置 我想这样做 以便当用户刷新报表时 仅提示用户输入的参数 我知道 ReuseParameterValuesOnRefresh 属性 但这使得所有参
  • wso2 Esb 中代理服务和 API 服务的区别

    wso2esb 中的代理服务和 API 服务有什么区别 为了公开我的服务 我可以提供代理 URL 和 API URL 那么在哪种情况下两者会有所不同 在什么情况下可以使用代理 在什么情况下可以使用API 请帮助我理解 API 具有资源 因此
  • Apache-HttpComponents:套接字关闭错误

    我正在编写一个 Java 程序 它使用 Apache HttpComponents 加载页面并将其 HTML 打印到控制台 但是 该程序在抛出此错误之前仅打印部分 HTML Exception in thread main java net
  • 使用 fs.writeFile() 在 Node.js 中创建 .wav 文件

    我正在尝试创建一个 wav从 Node JS 中的数据块中读取文件 使用fs writeFile 首先 这可能吗 我目前正在尝试这个 fs writeFile filename wav blob recording function err
  • 文档数据库中架构更改的模式

    在我开始之前我想为此道歉 我的问题的通用类型 我确信整本书 可以就该特定主题进行写作 假设您有一个包含多个文档模式的大型文档数据库 以及每个模式的数百万个文档 在应用程序的生命周期中 需要更改架构 经常查看已存储的文档 和内容 这样的改变可
  • 将数据帧分成两部分并使用波形符 ~ 作为变量

    我想在 Python 3 中用 Pandas 做 2 个类似的操作 一个带波浪号 另一个不带波浪号 1 df df df teste isin Place 2 df df df teste isin Place 我尝试将波形符声明为变量 这
  • 如果列表中存在某个项目,如何删除该项目?

    我正进入 状态new tag从表单文本字段self response get new tag and selected tags来自复选框字段 self response get all selected tags 我这样组合它们 tag