当前位置: 首页 > news >正文

4 个你可能不知道的 Python 迭代工具过滤器函数

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景

当您只想循环遍历迭代器、检索序列中的元素并处理它们时,这些元素特别有用 - 所有这些都无需将它们存储在内存中。今天我们将学习如何使用以下四个迭代工具过滤器函数:

  • filterfalse
  • takewhile
  • dropwhile
  • islice

让我们开始吧!

开始之前:有关代码示例的说明

在本教程中:

  • 我们将讨论的所有四个函数都给出了迭代器。为了清楚起见,我们将使用简单的序列,并用于获取包含迭代器返回的所有元素的列表。但是,除非必要,否则在处理长序列时不要这样做。因为当您这样做时,您将失去迭代器为您提供的内存节省。list()
  • 对于简单的谓词函数,您还可以使用 lambda。但为了更好的可读性,我们将定义常规函数并将它们用作谓词。

1. filterfalse

如果你已经用Python编程了一段时间,你可能会使用内置函数和语法:filter

filter(pred,seq)
# pred: predicate function
# seq: any valid Python iterable

该函数提供了一个迭代器,该迭代器从谓词返回的序列中返回元素。filterTrue

让我们举个例子:

nums = list(range(1,11)) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]def is_even(n):return n % 2 == 0

在这里,列表和函数分别是序列和谓词。numsis_even

为了获取 中所有数的列表,我们使用如下所示的:numsfilter

nums_even = filter(is_even, nums)
print(list(nums_even))
Output >>> [2, 4, 6, 8, 10]

现在让我们了解.我们将从 itertools 模块导入函数(以及我们将讨论的所有其他函数)。filterfalsefilterfalse

顾名思义,与函数的作用相反。它提供了一个迭代器,该迭代器返回谓词返回的元素。以下是使用该函数的语法:filterfalsefilterFalsefilterfalse

from itertools import filterfalse
filterfalse(pred,seq)

该函数返回 中的所有奇数。因此,使用获得的列表是以下所有奇数的列表:is_evenFalsenumsnums_oddfilterfalsenums

from itertools import filterfalsenums_odd = filterfalse(is_even, nums)
print(list(nums_odd)) 
Output >>> [1, 3, 5, 7, 9]

2. takewhile

使用该函数的语法为:takewhile

from itertools import takewhile
takewhile(pred,seq)

该函数给出一个迭代器,只要谓词函数返回 .当谓词首次返回时,它将停止返回元素。takewhileTrueFalse

对于 n 长度序列,if 是谓词函数返回的第一个元素,则迭代器返回 ,..., .seq[k]Falseseq[0]seq[1]seq[k-1]

考虑以下列表和谓词函数。我们使用如下所示的函数:numsis_less_ than_5takewhile

from itertools import takewhiledef is_less_than_5(n):return n < 5nums = [1, 3, 5, 2, 4, 6]
filtered_nums_1 = takewhile(is_less_than_5, nums)
print(list(filtered_nums_1))  

在这里,谓词首次返回数字 5:is_less_than_5False

Output >>> [1, 3]

3. dropwhile

在功能上,函数执行与函数相反的操作。dropwhiletakewhile

以下是使用该函数的方法:dropwhile

from itertools import dropwhile
dropwhile(pred,seq) 

该函数提供了一个不断丢弃元素的迭代器,只要谓词是 .这意味着迭代器在谓词第一次返回之前不会返回任何内容。一旦谓词返回,迭代器返回序列中的所有后续元素。dropwhileTrueFalseFalse

对于 n 长度序列,if 是谓词函数返回的第一个元素,则迭代器返回 ,..., .seq[k]Falseseq[k]seq[k+1]seq[n-1]

让我们使用相同的序列和谓词:

from itertools import dropwhiledef is_less_than_5(n):return n < 5nums = [1, 3, 5, 2, 4, 6]
filtered_nums_2 = dropwhile(is_less_than_5, nums)
print(list(filtered_nums_2)) 

因为谓词函数第一次返回元素 5,所以我们得到从 5 开始的序列的所有元素:is_less_than_5False

Output >>> [5, 2, 4, 6]

4. islice

您已经熟悉对 Python 可迭代对象(如列表、元组和字符串)进行切片。切片采用语法:。iterable[start:stop:step]

但是,这种切片方法具有以下缺点:

  • 处理大型序列时,每个切片或子序列都是占用内存的副本。这可能效率低下。
  • 由于步骤也可以采用负值,因此使用开始值、停止值和步骤值会影响可读性。

该函数解决了上述限制:islice

  • 它返回一个迭代器。
  • 它不允许该步骤为负值。

您可以像这样使用该函数:islice

from itertools import islice
islice(seq,start,stop,step) 

以下是使用该函数的几种不同方式:islice

  • Using 返回切片上的迭代器,,..., .islice(seq, stop)seq[0]seq[1]seq[stop - 1]
  • 如果指定开始值和停止值:该函数在切片上返回一个迭代器,,..., .islice(seq, start, stop)seq[start]seq[start + 1]seq[start + stop - 1]
  • 指定开始、停止和步进参数时,该函数将返回切片、、,..., .这样<和>= .seq[start]seq[start + step]seq[start + 2*step]seq[start + k*step]start + k*stepstopstart + (k+1)*stepstop

让我们举一个示例列表来更好地理解这一点:

nums = list(range(10)) #[0,1, 2, 3, 4, 5, 6, 7, 8, 9]

现在让我们将该函数与我们学到的语法一起使用。islice

仅使用停止值

让我们只指定停止索引:

from itertools import islice# only stop
sliced_nums = islice(nums, 5)
print(list(sliced_nums)) 

这是输出:

Output >>> [0, 1, 2, 3, 4]

使用开始值和停止值

在这里,我们同时使用开始值和停止值:

# start and stop
sliced_nums = islice(nums, 2, 7)
print(list(sliced_nums))

切片从索引 2 开始,一直延伸到但不包括索引 7:

Output >>> [2, 3, 4, 5, 6]

使用开始值、停止值和步长值

当我们使用开始值、停止值和步长值时:

# using start, stop, and step
sliced_nums = islice(nums, 2, 8, 2)
print(list(sliced_nums))  

我们得到一个从索引 2 开始的切片,一直延伸到但不包括索引 8,步长为 2(每隔一个元素返回一次)。

Output >>> [2, 4, 6]

总结

我希望本教程能帮助您了解迭代工具过滤器函数的基础知识。您已经看到了一些简单的示例,以更好地理解这些函数的工作原理。接下来,您可以了解生成器生成器函数和生成器表达式如何作为高效的 python 迭代器工作。

原文链接:4 个你可能不知道的 Python 迭代工具过滤器函数 (mvrlink.com)

相关文章:

4 个你可能不知道的 Python 迭代工具过滤器函数

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 当您只想循环遍历迭代器、检索序列中的元素并处理它们时&#xff0c;这些元素特别有用 - 所有这些都无需将它们存储在内存中。今天我们将学习如何使用以下四个迭代工具过滤器函数&#xff1a; filterfalsetakewhiledr…...

Scrapy简介-快速开始-项目实战-注意事项-踩坑之路

scrapy项目模板地址&#xff1a;https://github.com/w-x-x-w/Spider-Project Scrapy简介 Scrapy是什么&#xff1f; Scrapy是一个健壮的爬虫框架&#xff0c;可以从网站中提取需要的数据。是一个快速、简单、并且可扩展的方法。Scrapy使用了异步网络框架来处理网络通讯&…...

lightdb 支持兼容Oracle的to_clob函数

文章目录 概述案例演示 概述 在信创移植的SQL语句中&#xff0c;有来源于Oracle数据库的SQL语句。 在ORACLE PL/SQL包中&#xff0c;你可以使用TO_CLOB(character)函数将RAW、CHAR、VARCHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB值转换为CLOB。 因此在LightDB 23.3版本中实现了…...

ES6中let和const关键字与var关键字之间的区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量作用域&#xff08;Scope&#xff09;&#xff1a;⭐ 变量提升&#xff08;Hoisting&#xff09;&#xff1a;⭐ 重复声明&#xff1a;⭐ 初始化&#xff1a;⭐ 全局对象属性&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#…...

Python中的异常处理3-1

Python中的异常指的是语法上没有错误&#xff0c;但是代码执行时会导致错误的情况。 1 抛出异常 在图1所示的代码中&#xff0c;要求用户输入一个数字&#xff0c;该代码在语法上没有错误。 图1 出现异常的代码 但是运行该代码之后&#xff0c;如果用户输入的是数字&#xf…...

大数据与AI:解析智慧城市的幕后英雄

文章目录 1. 智慧城市的定义与发展2. 大数据&#xff1a;智慧城市的基石2.1 大数据的概念与重要性2.2 大数据的应用案例2.2.1 智能交通管理2.2.2 能源效率优化2.2.3 城市规划与土地利用 3. 人工智能&#xff1a;智慧城市的大脑3.1 人工智能的概念与重要性3.2 人工智能的应用案例…...

将钉钉机器人小程序从一个公司迁移至另一个公司的步骤

引言&#xff1a; 由于我们以前开发的钉钉小程序都在一个公司&#xff0c;想在想应用到另一个公司&#xff0c;这就牵扯出了关于钉钉小程序迁移方面的具体步骤。下面是具体步骤&#xff1a; 1、创建一个钉钉小程序 在这一步你需要有钉钉开放平台的开发者权限&#xff0c;具体…...

j解决Ubuntu无法安装pycairo和PyGObject

环境&#xff1a;虚拟机Ubuntu20.04&#xff0c;vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20.04&#xff0c;vscode中运行Anaconda搭建的vens 的Python3.8.10 首先在vscode中点击ctrlshiftp&#xff0c;选择Python3.8.10的环境&#xff0c;自动激活Python 最近在搞无人…...

PBI 背景全屏规律呈现水印

想要在Power BI报表中实现全屏规律呈现斜角水印的效果,并且显示的值是用户登录的email的话,目前Power BI desktop的背景“Background”功能中暂时没有支持的直接设置方法。但是基于测试和研究,Power BI市场中有一个叫“HTML Content”的custom visual提供,它支持嵌入一些HT…...

2023年全国职业院校技能大赛信息安全管理与评估网络安全事件响应、数字取证调查、应用程序安全任务书

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块二 网络安全事件响应、数字取证调查、应用程序安全 比赛时间及注意事项 本阶段比赛时长为180分钟&#xff0c;时间为13:30-16:30。 【注意事项】 比赛结束&#xff0c;不得关机&#xff1b;选手首先需要…...

浙大陈越何钦铭数据结构08-图7 公路村村通【循环和最小堆版】

题目 现有村落间道路的统计数据表中&#xff0c;列出了有可能建设成标准公路的若干条道路的成本&#xff0c;求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N&#xff08;≤1000&#xff09;和候选道路数目M&#xff08;≤3N&#xff09;…...

Linux 部署1Panel现代化运维管理面板远程访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…...

用百度云怎么重装电脑系统

用百度云怎么重装电脑系统 随着云计算技术的飞速发展&#xff0c;百度云成为了人们日常生活中不可或缺的一部分。百度云不仅提供了强大的文件存储和传输功能&#xff0c;还可以帮助人们轻松地重装电脑系统。下面就让我们来介绍一下如何用百度云重装电脑系统。 步骤一&#xf…...

SpringCloud环境搭建及入门案例

技术选型&#xff1a; Maven 3.8.4SpringBoot 2.7.8SpringCloud 2021.0.4SpringCloudAlibaba 2022.0.1.0Nacos 2.1.1Sentinel 1.8.5 模块设计&#xff1a; 父工程&#xff1a;SpringCloudAlibaba订单微服&#xff1a;order-service库存微服&#xff1a;stock-service 1.创建…...

什么是序列化和反序列化?

JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种常用的数据交换格式&#xff0c;用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式&#xff0c;它使用易于理解的键值对的形式表示数…...

React 消息文本循环展示

需求 页面上有个小喇叭&#xff0c;循环展示消息内容 逻辑思路 设置定时器&#xff0c;修改translateX属性来实现滚动&#xff0c;判断滚动位置&#xff0c;修改list位置来实现无限滚动 实现效果 代码 /** Author: Do not edit* Date: 2023-09-07 11:11:45* LastEditors: …...

java获取jenkins发布版本信息

一.需求&#xff1a; 系统cicd发布时首页需要展示jenkins发布的版本和优化内容 二.思路: 1.jenkins创建用户和秘钥 2.找到对应构建任务信息的api 3.RestTemplate发起http请求 三.实现&#xff1a; 1.创建用户和token 2.查找jenkins API 创建 Job POST http://localhost…...

java八股文面试[数据库]——可重复读怎么实现的(MVCC)

可重复读&#xff08;repeatable read&#xff09;定义&#xff1a; 一个事务执行过程中看到的数据&#xff0c;总是跟这个事务在启动时看到的数据是一致的。 MVCC MVCC&#xff0c;多版本并发控制, 用于实现读已提交和可重复读隔离级别。 MVCC的核心就是 Undo log多版本链 …...

cl 和 “clangtidy“分别是什么?是同一样东西吗?

作者&#xff1a;gentle_zhou 原文链接&#xff1a;cl 和 "clangtidy"分别是什么&#xff1f;是同一样东西吗&#xff1f;-云社区-华为云 先说结论&#xff1a;这两个是不同的工具&#xff0c;cl是编译器&#xff0c;clangtidy是代码检查工具&#xff0c;它们不是一…...

ubuntu22.04开机自启动Eureka服务

ubuntu22.04开机自启动Eureka服务 1、创建启动脚本eurekaService.sh #我们把启动脚本放在/usr/software目录下 cd /usr/software vim eurekaService.sheurekaService.sh内容为 #!/bin/sh # this is a eurekaService shell to startup at the mechian power on.echo "eu…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...