深入探索Python中的推导式:从列表到字典,全面解析数据结构的快速构建方法

文章目录

    • 1. 列表推导式:快速构造列表
      • 1.1 基础用法
      • 1.2 条件筛选
    • 2. 字典推导式:动态构建字典
      • 2.1 基础用法
      • 2.2 使用条件过滤
    • 3. 集合推导式:有效去重与数据筛选
      • 3.1 基本语法与应用
      • 3.2 去重和转换
      • 3.2 使用条件过滤
    • 4. 生成器推导式:节约内存的迭代器
      • 4.1 基础语法和解释
      • 4.2 为什么不是“元组推导式”

Python的推导式是一种强大的数据结构生成工具,它不仅能提升代码的可读性,还能在很大程度上优化性能。本文将详细介绍四种主要的推导式——列表推导式、字典推导式、集合推导式和生成器推导式。

在这里插入图片描述

1. 列表推导式:快速构造列表

1.1 基础用法

列表推导式是最常用的推导式类型之一,它提供了一种非常简洁的方式来创建列表。

这种形式非常适合用来替代简单的循环语句。例如,生成一个包含0到9每个数字平方的列表:

# 列表推导式基本语法: [element for element in iterable if condition]
squares = [x**2 for x in range(10)]
print(squares)
# 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

上述代码中,x**2 是列表中的新元素,x in range(10) 遍历0到9,x**2 对每个x计算平方。这比传统的for循环更加直观和简洁。

1.2 条件筛选

列表推导式可以包含条件表达式,用于筛选符合条件的元素。例如,从列表中选出所有偶数:

numbers = range(20)
evens = [x for x in numbers if x % 2 == 0]
print(evens)
# 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

这里,if x % 2 == 0 是一个条件判断,只有当x为偶数时,它才会被加入到新的列表中。

2. 字典推导式:动态构建字典

2.1 基础用法

字典推导式可以快速地从一组键值对生成字典,是处理键值数据时非常有用的工具。

例如,将两个列表转化为一个字典,其中一个列表作为键,另一个列表作为值:

# 基本语法:{key_expression: value_expression for item in iterable if condition}
keys = ["name", "age", "gender"]
values = ["Alice", 28, "female"]
info_dict = {keys[i]: values[i] for i in range(len(keys))}
print(info_dict)
# 输出: {'name': 'Alice', 'age': 28, 'gender': 'female'}

这个例子中,range(len(keys)) 生成索引序列,用来同时从keysvalues取值。

2.2 使用条件过滤

字典推导式同样可以包含条件表达式。例如,过滤掉某些不符合条件的元素:

scores = {"Alice": 88, "Bob": 59, "Cathy": 97}
passed = {name: score for name, score in scores.items() if score >= 60}
print(passed)
# 输出: {'Alice': 88, 'Cathy': 97}

这里,if score >= 60 确保只有分数达到60分以上的学生才会被包含在新的字典中。

3. 集合推导式:有效去重与数据筛选

集合推导式是一种构建集合的简洁方式,非常适合于去除列表或其他可迭代对象中的重复元素。集合(Set)是一个无序的不包含重复元素的数据结构,因此它是实现元素唯一性的理想选择。

3.1 基本语法与应用

集合推导式的基本语法:{expression for item in iterable if condition}

这里的expression是根据迭代的item计算得到的表达式,iterable是一个序列、集合或任何迭代器,而condition是一个可选的条件表达式,用于筛选满足条件的项。

3.2 去重和转换

假设你有一个包含多个重复数字的列表,你想去除重复项,并将每个数字增加1:

numbers = [1, 2, 2, 3, 4, 4, 4, 5]
unique_numbers = {x + 1 for x in numbers}
print(unique_numbers)
# 输出: {2, 3, 4, 5, 6}

在这个例子中,表达式x + 1确保了集合中每个元素都是原始元素加一的结果,而集合的自然属性保证了所有元素的唯一性。

3.2 使用条件过滤

集合推导式可以结合条件表达式,使其更加强大。例如,筛选大于3的元素,只保留这些元素的平方:

numbers = [1, 2, 2, 3, 4, 4, 4, 5]
filtered_squares = {x**2 for x in numbers if x > 3}
print(filtered_squares)
# 输出: {16, 25}

这里,条件if x > 3用于筛选出大于3的元素,表达式x**2则对筛选后的元素进行平方运算。

4. 生成器推导式:节约内存的迭代器

4.1 基础语法和解释

在Python中,术语“生成器推导式”(Generator Comprehensions)经常使人误以为会生成一个元组,因为它在语法上看起来与列表推导式非常相似,只是使用圆括号代替方括号。实际上,这种表达式生成的是一个生成器对象,而不是元组,这就是为什么它被称为生成器推导式而不是元组推导式。

生成器对象

生成器是一种迭代器,它支持延迟执行(惰性求值),只在需要时才生成或计算下一个值。这种特性使生成器非常适合处理大型数据集或复杂计算,因为它们不需要在内存中同时存储所有项。

语法和行为

生成器推导式的基本语法:(expression for item in iterable if condition)

这与列表推导式非常相似,但生成器推导式返回的是一个生成器对象。这意味着计算值的过程是按需进行的(惰性的),而不是立即计算出所有值。

4.2 为什么不是“元组推导式”

元组是不可变的数据结构,一旦创建就不能更改。如果Python支持所谓的“元组推导式”,按照推导式的定义,它将一次性计算所有值并将它们存储在元组中,这与生成器的按需生成和低内存消耗的特性完全相反。

实际上,当使用看似元组推导式的语法时(使用圆括号),Python解释器实际上是创建了一个生成器对象。

# 生成器推导式:(expression for item in iterable if condition)
squares = (x**2 for x in range(10))# 使用生成器
for square in squares:print(square)
# 这将按需打印每个数的平方,而不是一次性计算所有平方。

如果尝试使用类似推导式的语法来创建元组,例如通过将生成器推导式直接转换为元组,可以使用以下方法:

# 将生成器推导式的结果转换为元组
squares_tuple = tuple(x**2 for x in range(10))
print(squares_tuple)
# 输出: (0, 1, 4, 9, 16, 25, 36, 49, 64, 81)

总结来说,没有所谓的“元组推导式”,因为生成器推导式的设计初衷是为了按需生成值,减少内存消耗,而不是一次性构建一个完整的不可变序列。这种设计选择反映了Python在提供灵活而高效数据处理工具方面的一贯原则。


推荐: python 错误记录
参考:Comprehensions and Generator Expression in Python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于CH32V103的多功能推杆设计

一、项目简介 “创意源于生活,工具始于懒惰。” 整体造型外观参考了最近比较火的夫妻游戏《双人成行》第一关里面那个吸尘器的推杆开关,结构中采用阻尼器/滚珠轴承等器件,使其非常具有质感和手感。功能上我构思不能只有电脑开关这么简单地一…

Jenkins CI/CD 持续集成专题三 Jenkins 使用shell脚本打包组件配置流程

第一步 新建任务 第二步 输入项目名称和选择自由风格的软件项目点击确定 第三步 配置下项目地址和账号密码 第四步 配置 build steps 选择 shell 脚本 第五步 shell 配置 (注意shell 必须以#!/bin/sh开头,否则会报 找不到shell 命令的错) …

【Web】DASCTF X CBCTF 2022九月挑战赛 题解

目录 dino3d Text Reverser cbshop zzz_again dino3d 进来是一个js小游戏 先随便玩一下,显示要玩够1000000分 直接console改分数会被检测 先是JSFinder扫一下,扫出了check.php 到js里关键词索引搜索check.php 搜索sn,发现传入的参数是…

3-羟基丙酸(3-HP)应用前景广阔 生物基3-羟基丙酸市场占比将不断提升

3-羟基丙酸(3-HP)应用前景广阔 生物基3-羟基丙酸市场占比将不断提升 合成技术是制约3-羟基丙酸规模化应用的重要因素。3-羟基丙酸合成技术包括化学合成法、生物合成法两大类,其中化学合成法是主流生产工艺,但化学合成法存在工艺复…

.netcore+vue新生分班系统的设计与实现

.netcore vue新生分班系统的设计与实现说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于.net core架构和mysql数据库vue 东北石油大学新生分班系统的设计与实现 功能模块: 登录 注册学生 忘记密码 系统首顶 个…

完成学校官网页面制作

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>教务系统</title> <style> .wap{ margin:0 auto; width:955px; } .top{ height:150px; padding-left:85px; …

DHCP服务器配置故障转移后显示红色箭头、与伙伴服务器失去联系的解决方案

一、遇到的故障现象&#xff1a; &#xff08;主DHCP服务器与备用DHCP服务器连通性正常&#xff0c;在故障转移选项卡上却显示与伙伴失去联系、伙伴关闭&#xff0c;且ipv4协议旁边显示一个红色的小箭头&#xff09;&#xff0c;正常情况下是绿色 &#xff08;一&#xff09;…

外包干了6天,技术明显退步。。。

我是一名大专生&#xff0c;自19年通过校招进入湖南某软件公司以来&#xff0c;便扎根于功能测试岗位&#xff0c;一晃便是近四年的光阴。今年3月&#xff0c;我如梦初醒&#xff0c;意识到长时间待在舒适的环境中&#xff0c;已让我变得不思进取&#xff0c;技术停滞不前。更令…

金三银四面试题(二十):单例模式知多少?

设计模式也是面试中的热门考题&#xff0c;基本这个部分都是问问你知不知道XXX设计模式&#xff0c;有什么用&#xff0c;优缺点&#xff0c;然后再现场手写一个demo。很多时候是和spring一起考的&#xff0c;问问你知不知道spring框架用了哪些设计模式。今天我们来先看看单例模…

代码+视频,R语言对数据进行多重插补后回归分析

我们在临床做回顾性研究分析中经常要面对数据缺失的问题&#xff0c;如果数据缺失量大就会对我们的研究结果产生影响&#xff0c;近年来&#xff0c;对数据进行多重插补广泛应用于SCI论文中。我们在之前的文章中已经演示了使用SPSS对数据进行多重插补并分析。今天&#xff0c;我…

贪吃蛇的简单实现(c语言)

前言&#xff1a;学完了C语言的基础语法&#xff0c;和一点数据结构的知识&#xff0c;拿贪吃蛇来练练手&#xff0c;并熟悉以前的知识。写完之后&#xff0c;有一种成就感&#xff0c;为以后的学习饱满激情。 注意这里的讲解是由部分到整体的思路。 目录 控制台不能是终端&am…

ubuntu环境下使用g++把c++编译成汇编语言(暂时)

1. 引言 为了深入理解c&#xff0c;决定学习一些简单的汇编语言。使用ubuntu系统下g很容易将一个c的文件编译成汇编语言。本文使用此方法&#xff0c;对一个简单的c文件编译成汇编语言进行理解。 2.示例 文件名&#xff1a;reorder_demo.cpp #include<stdio.h>typede…

逻辑回归+分类的评估方式

一&#xff1a;什么是逻辑回归 解决二分类问题 二&#xff1a;损失及优化 三&#xff1a;逻辑回归API 四&#xff1a;案例 五&#xff1a;分类的评估方式 评估公式 分类评估API ROC与AUC&#xff08;介绍API&#xff09;衡量不平衡样本 ROC曲线的绘制 分类中解决类别不平衡

HackmyVM-----Boxing靶机

文章目录 正常打靶流程1.获取靶机IP地址2.获取靶机端口服务3.访问网页4.添加域名WindowsLinux 5.访问域名6.nc反弹shell 7.结束 正常打靶流程 1.获取靶机IP地址 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, …

Drive Scope for Mac:硬盘健康监测分析工具

Drive Scope for Mac是一款专为Mac用户设计的硬盘健康监测与分析工具&#xff0c;致力于保障用户的数据安全。这款软件功能强大且操作简便&#xff0c;能够实时检测硬盘的各项指标&#xff0c;帮助用户及时发现并解决潜在问题。 Drive Scope for Mac 1.2.23注册激活版下载 Driv…

linux 驱动-匹配2 (amba_bustype)

目录 1.实例分析 a. 设备树实例 b. 驱动实例 2. amba匹配流程 a. 创建amba_device b. 确定总线以及总线的匹配函数 c. 分析总线的匹配函数 1.实例分析 a. 设备树实例 serial7e201000 { compatible "brcm,bcm2835-pl011\0arm,pl011\0arm,primecell"; //创建am…

用Python自动化操作PPT,看完这篇文章就够了!

1.PPT自动化能干什么&#xff1f;有什么优势&#xff1f; 它可以代替你自动制作PPT它可以减少你调整用于调整PPT格式的时间它可以让数据报告风格一致总之就是&#xff1a;它能提高你的工作效率&#xff01;让你有更多时间去做其他事情&#xff01; 2.使用win32com操作ppt 官…

【探索Linux】P.32(自定义协议)

阅读导航 引言一、自定义协议概念二、自定义协议需要注意的事项三、自定义协议示例(跨网络计算器协议)✅协议代码&#xff08;Protocol.hpp&#xff09;1. 计算器协议简单介绍2. 序列化部分3. 反序列化部分4. 请求和响应数据结构5. 使用自定义协议 四、总结温馨提示 引言 在上…

Rust Tracing 入门

Tracing 是一个强大的工具&#xff0c;开发人员可以使用它来了解代码的行为、识别性能瓶颈和调试问题。 Rust 是一种以其性能和安全保证而闻名的语言&#xff0c;在它的世界中&#xff0c;跟踪在确保应用程序平稳高效运行方面发挥着至关重要的作用。 在本文中探讨Tracing 的概…

C++ 初识模板

目录 0.前言 1.泛型编程 2.函数模板 2.1概念 2.2格式 2.3原理 2.4函数模板的实例化 2.4.1隐式实例化 2.4.2显式实例化 2.5模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 4.结语 &#xff08;图像由AI生成&#xff09; 0.前言 在 C 中&a…