37 列表推导式

news2024/12/24 8:41:45

列表推导式(list comprehension) 也成为列表解析式,可以使用非常简洁的方式对列表或其他可迭代对象的元素进行遍历、过滤或再次计算,快速生成满足特定需求的新列表,代码非常简洁,具有很强的可读性,是 python 程序开发过程时应用最多的技术之一。Python 的内部实现对列表推导式做了大量语法优化,可以保证很快的运行速度,也是推荐使用的一种技术。
列表推导式在逻辑上等价于一个循环语句,只是在形式上更加简洁。

x = [x * x for x in range(10)]
print(x)
# 等价于
x = []
for i in range(10):
    x.append(i * i)
print(x)

y = ['banana', 'loganberry', 'passion fruit']
print([i.strip() for i in y])
# 等价于
z = []
for i in y:
    z.append(i.strip())
print(z)
# 等价于
print(list(map(lambda i: i.strip(), y)))
print(list(map(str.strip, y)))

在这里插入图片描述

1 实现嵌套列表的平铺

列表推导式中有两个循环,第一个循环可以看作外循环,执行得慢;第二个循环可以看作内循环,执行得快。

from itertools import chain

vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print([j for i in vec for j in i])
# 等价于
vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
s = []
for i in vec:
    for j in i:
        s.append(j)
print(s)
print(list(chain(*vec)))

在这里插入图片描述

如果有多级嵌套或者不同子列表嵌套深度不同,就不能使用上面的方法了。这时,可以使用函数递归实现。

def flat_list(s):
    g = []  # 存放最终结果的列表

    def nested(s):  # 函数嵌套定义
        for i in s:
            if isinstance(i, list):
                nested(i)  # 递归子列表
            else:
                g.append(i)  # 扁平化列表

    nested(s)  # 调用嵌套定义的函数
    return g  # 返回结果


vec = [[1], [1, 'g'], ['a'], [], [12, 24]]
print(flat_list(vec))

在这里插入图片描述

2 过滤不符合条件的语句

在列表推导式中可以使用 if 子句对列表中的元素进行筛选,只在结果列表中保留符合条件的元素。

vec = [-1, -4.6, 7.5, -2.3, 9, -11]
print([i for i in vec if i > 0])  # 所有大于 0 的数字

scores = {'zs': 45, 'ls': 78, 'ww': 40, 'zl': 96,
          'zq': 65, 'sb': 90, 'zj': 78, 'ws': 99, 'ds': 60}
highest = max(scores.values())  # 最高分
lowest = min(scores.values())  # 最低分
avg = sum(scores.values()) / len(scores)  # 平均分
print(highest, lowest, avg)
highest_person = [name for name, score in scores.items() if score == highest]
print(highest_person)

在这里插入图片描述

from random import randint

# 使用列表推导式查找列表中最大元素的所有位置
x = [randint(10, 100) for i in range(10)]  # 10个介于[10,100]之间的整数
print(x)
print([index for index, value in enumerate(x) if value == max(x)])

在这里插入图片描述

3 同时遍历多个列表或可迭代对象

对于包含多个循环的列表推导式,一定要清楚多个循环的执行顺序或 “嵌套关系”。

print([(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y])
# 等价于
g = []
for x in [1, 2, 3]:
    for y in [3, 1, 4]:
        if x != y:
            g.append((x, y))
print(g)

print([(x, y) for x in [1, 2, 3] if x == 1 for y in [3, 1, 4] if x != y])

在这里插入图片描述

4 使用列表推导式实现矩阵转置

对于嵌套了列表推导式的列表推导式,一定要清楚其执行顺序。

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
print(matrix)
print([[row[i] for row in matrix] for i in range(4)])
# 等价于
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
g = []
for i in range(4):
    g.append([row[i] for row in matrix])
print(g)
# 等价于
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
g = []
for i in range(4):
    temp = []
    for row in matrix:
        temp.append(row[i])
    g.append(temp)
print(g)

在这里插入图片描述

可以使用内置函数 zip() 和 list() 来实现矩阵转置。

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
print(list(map(list, zip(*matrix))))

在这里插入图片描述

5 列表推导式中可以使用函数或复杂表达式

def func(v):
    if v % 2 == 0:
        v = v ** 2
    else:
        v = v + 1
    return v


print([func(v) for v in [2, 3, 4, -1] if v > 0])
# 等价于
print([v ** 2 if v % 2 == 0 else v + 1 for v in [2, 3, 4, -1] if v > 0])

在这里插入图片描述

6 列表推导式支持文件对象迭代

with open('test.txt', 'r') as fp:
    print([line for line in fp])

在这里插入图片描述

7 使用列表推导式生成 100 以内的所有素数

from math import sqrt

print([x for x in range(2, 100) if 0 not in
       [x % d for d in range(2, int(sqrt(x)) + 1)]])

在这里插入图片描述

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

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

相关文章

抖音视频素材网站有哪些?非常好用的5个抖音视频素材库分享

在打造引人入胜的抖音视频时,选择高品质的视频素材至关重要。优选的素材不仅能够显著提升视频的吸引力,还能让你的作品在众多视频中突出重围。对于抖音创作者而言,让我们探索一些备受推崇的视频素材平台,帮助你制作出既专业又引人…

C:操作符介绍-学习笔记

目录 引言&#xff1a; 1、操作符的分类&#xff1a; 2、原码&#xff0c;反码&#xff0c;补码 2.1 介绍 2.2 作用 3、移位操作符&#xff1a;>>、 << 3.1 左移操作符 &#xff1a;<< 3.1.1 正整数移动 3.1.2 负整数移动 3.2 右移操作符&#xff…

Unity GameObject学习笔记

GameObject成员变量 GameObject静态方法 //准备用来克隆的对象//1.直接是场景上的某个对象//2.可以是一个预制体对象public GameObject Myobj; #region 知识点二 GameObject中的静态方法创建自带几何体只要得到了一个GameObject对象 我就可以得到它身上挂载的任何脚本信息GameO…

YotoR(You Only Transform One Representation)

本文介绍了一种名为YotoR&#xff08;You Only Transform One Representation&#xff09;的新型深度学习目标检测模型。该模型将Swin Transformers与YoloR架构相结合。在自然语言处理领域引起革命的Transformer技术&#xff0c;如今同样对计算机视觉产生了深远影响&#xff0c…

7.29 模拟赛总结 平面图欧拉定理

复盘 7:40 开题 开题失败&#xff0c;由于前一天有 cf&#xff0c;模拟赛移到下午了 13:45 开题 看 T1&#xff0c;题意很抽象&#xff0c;理清后发现&#xff1a;这直接 dj 不就行了&#xff1f;不会错吧不会错吧&#xff0c;看着 n 1000 n1000 n1000 的数据范围还是不确…

java实现权重轮询算法

package com.example.demo.demos.web.nginx;import java.util.ArrayList; import java.util.List;public class WeightedRoundRobin {private static List<Server> servers new ArrayList<>(); // 存储服务器的列表private static int currentIndex -1; // 当前服…

APP测试基本流程以及APP测试要点梳理,成功入职就靠它了

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【MATLAB源码-第161期】基于matlab的OQPSK系统仿真,输出误码率曲线图,眼图以及各节点信号图像对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交四相移相键控&#xff08;OQPSK&#xff0c;Orthogonal Quadrature Phase Shift Keying&#xff09;是一种数字调制技术&#xff0c;它在传统的QPSK&#xff08;Quadrature Phase Shift Keying&#xff0c;四相移相键控&…

Linux--序列化与反序列化

序列化 序列化是指将数据结构或对象状态转换成可以存储或传输的格式的过程。在序列化过程中&#xff0c;对象的状态信息被转换为可以保持或传输的格式&#xff08;如二进制、XML、JSON等&#xff09;。序列化后的数据可以被写入到文件、数据库、内存缓冲区中&#xff0c;或者通…

jupyter notebook报错: No module named ‘pandas‘

打开jupyter notebook&#xff0c;新建Python3&#xff0c;编写代码import pandas as pd jupyter notebook: No module named pandas 解决办法 :打开Anaconda prompt&#xff0c;输入pip install pandas,安装时可能因为网速原因失败&#xff0c;用同样的命令再试一次&#xf…

数据透视表(二)

文章目录 导入外部数据源创建数据透视表Query 工具下的数据透视表创建如何统计业绩成交情况创建组利用函数构建辅助列创建组手动创建多样分组创建组区间统计创建组按年月日统计数据透视表的多种统计方法计算字段 导入外部数据源创建数据透视表 点击数据选项卡下数据-获取外部数…

04.FreeRTOS任务创建

04. FreeRTOS任务创建与任务删除 1. FreeRTOS创建和删除任务相关API函数 函数描述xTaskCreate()动态方式创建任务xTaskCreateStatic()静态方式创建任务xTaskCreateRestricted()动态方式创建使用 MPU 限制的任务xTaskCreateRestrictedStatic()静态方式创建使用 MPU 限制的任务…

js_拳皇(下)

文章目录 架构设计视频演示碰撞检测碰撞检测函数 构想血条和计时器全屏后续工作 架构设计 一图胜千言 #mermaid-svg-erOUDyAO5t0XgYyU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-erOUDyAO5t0XgYyU .error-icon{…

塞尔维亚皇家科学与艺术学院向迪科维奇将军颁发奖章

2015 年 6 月 28 日&#xff0c;在托波拉文化中心礼堂&#xff0c;由塞尔维亚皇家科学家与艺术学院&#xff08;SKANU&#xff09;组织举行了一场颁奖仪式&#xff0c;向过去一年里为科学院做出无私贡献的杰出个人和集体表示感谢。 经塞尔维亚皇家科学与艺术学院一致决定&#…

RWKV 社区近期有哪些学术研究进展?

2024 年 5 月 7 日&#xff0c;我们呼吁大家使用 RWKV-6 替代 Mamba 进行科研。截至 7 月 29 日&#xff0c;来自全球各地的科研团队已经陆续发表了 7 篇基于 RWKV 架构、在各个领域进行深入研究的论文。 新的 RWKV 学术研究主要聚焦于具身智能、图像处理、模型架构三个方面。…

[Windows] 简单易用的图片去水印工具,Inpaint 9.1 单文件版

很多软件都有这个功能&#xff0c;但这个算法非常自然&#xff0c;软件小巧。 而且极为简单&#xff0c;涂鸦笔一抹&#xff0c;点绿色的《处理图像》 &#xff0c;一秒完成。 我从它6.0的版本一直用过来。现在这个是9.1 发现论坛里的 都是几年前的&#xff0c;全部都失效了。 …

【策略工厂模式】记录策略工厂模式简单实现

策略工厂模式 1. 需求背景2. 代码实现2.1 定义基类接口2.2 排序策略接口定义2.3 定义抽象类&#xff0c;实现策略接口2.4 具体的排序策略实现类2.5 实现策略工厂类2.6 控制类 3. 启动测试4. 总结 1. 需求背景 现在需要你创建一个策略工厂类&#xff0c;来根据策略实现各种排序…

达梦数据库的系统视图v$buffer_lru_first

达梦数据库的系统视图v$buffer_lru_first 达梦数据库系统视图V$BUFFER_LRU_FIRST的主要作用是显示所有缓冲区LRU链首页信息。这个视图帮助数据库管理员监控和管理缓冲池中LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;链的性能&#xff0c;通过查看…

专业级享受:2024年视频剪辑工具深度评测与推荐

说到视屏剪辑很多人都会想要到剪映吧&#xff0c;那剪映怎么剪辑视屏呢&#xff1f;剪映之外还有没有其他好用到视屏剪辑软件呢&#xff1f;这次就分享一些我自己用过到工具吧。 1.福昕视频编辑 链接直达>>https://www.pdf365.cn/foxit-clip/ 这个视频剪辑软件大大的…

【Stable Diffusion】(基础篇六)—— embedding

embedding 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 除了大模型和VAE之外…