Python中的列表推导式(List Comprehension)

2023-10-09 17:36

本文主要是介绍Python中的列表推导式(List Comprehension),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

列表推导式

列表推导式(List Comprehension)是Python提供的一种简洁而优雅的方式,用于创建列表。它通常可以用来代替简单的for循环。

基本格式

列表推导式的基本格式如下:

[expression for item in iterable if condition]
  • expression 是根据迭代的每个元素计算得出的表达式。
  • for item in iterable 是迭代部分,它会遍历iterable中的每个元素。
  • if condition 是可选部分,用于过滤元素。

示例

  1. 创建一个列表,其中包含0到9的平方:

    squares = [x*x for x in range(10)]
    print(squares)  # 输出:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
  2. 从一个列表中选择偶数:

    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    evens = [x for x in numbers if x % 2 == 0]
    print(evens)  # 输出:[2, 4, 6, 8]
    
  3. 将列表中的元素都转换为大写:

    words = ["hello", "world"]
    uppercased = [word.upper() for word in words]
    print(uppercased)  # 输出:['HELLO', 'WORLD']
    

嵌套列表推导式

还可以在列表推导式中嵌套其他的for循环:

pairs = [(x, y) for x in [1, 2, 3] for y in [4, 5, 6]]
print(pairs)  # 输出:[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

注意事项

  • 列表推导式虽然简洁,但当它们变得过于复杂时,可读性可能会受到影响。在这种情况下,使用传统的for循环可能是更好的选择。

  • 列表推导式不仅仅局限于列表。还可以使用字典推导式(用于创建字典)和集合推导式(用于创建集合)。

  • 在大数据量的情况下,使用生成器表达式(generator expression)可能比列表推导式更有优势,因为它产生的是一个迭代器而不是一个完整的列表。例如:(x*x for x in range(10))

总的来说,列表推导式是Python的一个强大和优雅的功能,但与所有工具一样,最重要的是明智地使用它。

字典推导式

字典推导式(Dictionary Comprehension)是Python中创建字典的一种简洁方式,其语法和列表推导式相似,但是用于生成键值对组成的字典。字典推导式可以提高代码的简洁性并提高可读性(当用适当地时)。

基本格式

字典推导式的基本格式如下:

{key_expression: value_expression for item in iterable if condition}
  • key_expressionvalue_expression 分别计算每个键和值。
  • for item in iterable 是迭代部分,它会遍历iterable中的每个元素。
  • if condition 是可选的,用于过滤某些元素。

示例

  1. 创建一个字典,其中键是数字,值是该数字的平方:

    squares = {x: x*x for x in (2, 3, 4)}
    print(squares)  # 输出:{2: 4, 3: 9, 4: 16}
    
  2. 反转字典中的键和值:

    original = {"a": 1, "b": 2, "c": 3}
    reversed_dict = {value: key for key, value in original.items()}
    print(reversed_dict)  # 输出:{1: 'a', 2: 'b', 3: 'c'}
    
  3. 使用字典推导式过滤字典元素:

    prices = {"apple": 1.5, "banana": 0.5, "cherry": 2}
    expensive_fruits = {fruit: price for fruit, price in prices.items() if price > 1}
    print(expensive_fruits)  # 输出:{'apple': 1.5, 'cherry': 2}
    

注意事项

  • 虽然字典推导式可以使代码更简洁,但如果推导式过于复杂,可能会降低代码的可读性。在这种情况下,使用传统的循环构建字典可能更有意义。

  • 字典推导式和列表推导式在形式上很相似,但它们之间的一个主要区别是,字典推导式需要为每个元素提供键和值,而列表推导式只需要一个值。

  • 同样的,Python也支持集合推导式,它用于生成集合。

总的来说,字典推导式是Python中创建字典的一个优雅和强大的工具,但它的使用应该是考虑到特定上下文和可读性的。

集合推导式

集合推导式(Set Comprehension)是Python中创建集合的一种简洁方法。与列表推导式和字典推导式类似,集合推导式提供了一种简洁的语法来基于现有的可迭代对象生成集合。

基本格式

集合推导式的基本格式如下:

{expression for item in iterable if condition}
  • expression 是基于每个元素的计算得到的表达式。
  • for item in iterable 是迭代部分,它会遍历iterable中的每个元素。
  • if condition 是可选的,用于过滤某些元素。

示例

  1. 创建一个集合,其中包含0到9的奇数:

    odds = {x for x in range(10) if x % 2 != 0}
    print(odds)  # 输出:{1, 3, 5, 7, 9}
    
  2. 从列表中删除重复元素(尽管直接使用set()函数更简单,但这里展示的是推导式的用法):

    numbers = [1, 2, 2, 3, 4, 4, 4, 5]
    unique_numbers = {x for x in numbers}
    print(unique_numbers)  # 输出:{1, 2, 3, 4, 5}
    
  3. 获取一个句子中所有不重复的单词

    sentence = "apple banana apple cherry banana"
    unique_words = {word for word in sentence.split()}
    print(unique_words)  # 输出:{'apple', 'banana', 'cherry'}
    

注意事项

  • 与列表和字典推导式一样,集合推导式也应该在适当的时候使用,以保持代码的可读性。如果推导式变得过于复杂,使用传统的循环可能更为明智。

  • 因为集合是无序的,所以集合推导式生成的集合元素不保证有特定的顺序。

  • 集合中的元素是唯一的,所以集合推导式不会产生重复的元素,即使源可迭代对象中存在重复元素。

总的来说,集合推导式是Python中创建集合的一个简洁和优雅的工具。当需要根据已有数据快速生成集合时,它是一个非常有用的工具。

生成器表达式

生成器表达式(Generator Expression)是Python中的一种构造生成器(generator)的简洁方法。生成器是一个特殊类型的迭代器,它可以遍历元素,但不需要在内存中一次性存储所有元素。相反,生成器会在每次迭代时“按需”生成元素。

生成器表达式在形式上与列表推导式很相似,但使用圆括号()而不是方括号[]

基本格式

生成器表达式的基本格式如下:

(expression for item in iterable if condition)
  • expression 是基于每个元素的计算得到的表达式。
  • for item in iterable 是迭代部分,它会遍历iterable中的每个元素。
  • if condition 是可选的,用于过滤某些元素。

示例

  1. 创建一个生成器,该生成器产生0到9的平方:

    gen = (x*x for x in range(10))
    for value in gen:print(value)  # 依次输出:0, 1, 4, 9, 16, 25, 36, 49, 64, 81
    
  2. 计算生成器中的元素总和:

    gen = (x*x for x in range(10))
    total = sum(gen)
    print(total)  # 输出:285
    
  3. 与列表推导式的内存效率对比:

    # 使用列表推导式创建一个大列表
    big_list = [x*x for x in range(1000000)]# 使用生成器表达式创建一个生成器
    gen = (x*x for x in range(1000000))
    

    在上面的例子中,big_list会立即分配足够的内存来存储一百万个元素。而gen只是一个生成器,实际上不存储任何元素,而是在每次迭代时生成它们。因此,使用生成器可以节省大量内存。

注意事项

  • 生成器只能迭代一次。这是因为它们不实际存储数据,而是动态生成数据。一旦生成器迭代完成,不能再次从头开始迭代,除非重新创建生成器。

  • 生成器表达式特别适合处理大数据流,因为它们可以避免一次性加载整个数据集。

  • 如果需要多次访问数据或需要数据的随机访问能力,那么使用列表或其他数据结构可能更为合适。

总的来说,生成器表达式为创建轻量级、内存友好的迭代器提供了一个简洁和优雅的方法,特别是在处理大量数据时。


.items() 是 Python 字典对象(dict)的一个方法。它返回字典的所有键值对,使我们可以方便地遍历字典的键和值。

基本使用

当调用字典的 .items() 方法时,它会返回一个包含元组的视图对象,其中每个元组都包含一个键和一个值。这允许我们同时迭代字典的键和值。

示例:

dict_example = {"a": 1,"b": 2,"c": 3
}for key, value in dict_example.items():print(key, value)# 输出:
# a 1
# b 2
# c 3

特点

  1. 视图对象: .items() 返回的不是一个新的列表或其他集合,而是一个视图对象。这意味着该对象会反映字典的任何变化。如果字典在遍历其 .items() 时被修改(例如,添加或删除条目),则可能会出现运行时错误。

  2. 与推导式结合: 可以与各种推导式结合使用 .items(),例如列表推导式、字典推导式和集合推导式。

    示例:

    dict_example = {"a": 1,"b": 2,"c": 3
    }# 使用字典推导式将键和值颠倒
    reversed_dict = {value: key for key, value in dict_example.items()}
    print(reversed_dict)  # 输出: {1: 'a', 2: 'b', 3: 'c'}
    
  3. 与其他方法结合: 除了 .items(),字典还有 .keys().values() 方法,分别用于获取字典的键和值。

注意事项

  • 当想要同时处理字典的键和值时,使用 .items() 方法是很有用的。但是,如果只需要键或值,那么 .keys().values() 可能更为合适。

  • 因为 .items() 返回的是一个视图对象,而不是一个真正的列表,所以如果需要一个可以多次使用或修改的列表,可能需要使用 list() 函数将其转换为一个列表。

    示例:

    dict_example = {"a": 1,"b": 2,"c": 3
    }items_list = list(dict_example.items())
    print(items_list)  # 输出: [('a', 1), ('b', 2), ('c', 3)]
    

总的来说,.items() 方法提供了一种简洁的方式来遍历字典的键和值,并广泛用于各种操作,如推导式、循环和条件检查。

这篇关于Python中的列表推导式(List Comprehension)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/174470

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.