python 多维list 排序_一行代码的优雅| Python列表生成式

欢迎回来,上一周我们整理了基础课中三大结构有关内容的具体应用及案例。可以通过以下几篇推文进行回溯:

Python语言基础50课

我的Python - 100天笔记 |D1-D7

我的Python - 100天笔记 |D8-D14

列表是Python中非常常见的数据结构,在基础课中也占了不小的篇幅。今天的推送就列表相关的内容再整理。

列表是包含有索引的元素集,其中的元素可由字符、数字、字符串及子列表组成,用 list = []表示。基本操作包括:

  1. 增加元素list.append(obj) 在列表末尾添加新的元素 list.insert(index,obj) 能够在列表任意位置添加新的元素。

  2. 删除元素list.pop(index) 移除索引位置的元素,同时会返还被移除元素的值。del list[index] 移除移除索引位置的元素,但不返回移除元素的值,注意中间是空格。list.remove(obj) 移除第一个匹配到的元素。

  3. 修改元素list[index] = obj

  4. 查找元素list.index('obj')

  5. 列表排序sort(list) 永久性排序。temp_list = sorted(list) 返回一个新建的已排序列表。list.sort(reverse=Ture) 反向排序。

  6. 列表切片

    list[start:end:step] 切片是支持步长选择的。

嵌套列表的使用

嵌套的列表可以用来表示表格或数学上的矩阵,可以用于记录多维的数据,但是需要注意的是,嵌套列表不能够使用以下的方式生成:

scores = [[0] * 3] * 5print(scores)    # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
# 嵌套的列表需要多次索引操作才能获取元素

正确的方式如下(生成式):

scores = [[0] * 3 for _ in range(5)]scores[0][0] = 95print(scores)    # [[95, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

示例图如下:

da2ab2f8d7926ba574ffad6d08f95e00.png

第011课:常用数据结构之列表

列表生成式

[exp for iter_var in iterable]

生成式中,首先会将可迭代对象iterable中的每个元素的结果赋值给iter_var,然后通过exp得到一个新的计算值;最后把所有通过exp得到的计算值以一个新列表的形式返回。也就是与下列语句同效:

L = []
for iter_var in iterable:
    L.append(exp)

类似的,还有以下两种可使用的方式:

#带过滤功能语法格式
[exp for iter_var in iterable if_exp]

#循环嵌套语法格式
[exp for iter_var_A in iterable_A for iter_var_B in iterable_B]

也就是在之前的基础上,添加判断条件或嵌套循环。

例如,过滤出一个指定的数字列表中值大于20的元素

L = [3, 7, 11, 14,22, 33, 26, 57, 99]
# 不使用列表生成式实现
list_new = []
for x in L:
    if x 20:
        list_new.append(x)

# 使用列表生成式实现
list_newi = [x for x in L if x > 20]

再来一个例子:把一个列表中所有的字符串转换成小写,非字符串元素移除

L = ['TOM', 'Peter', 10, 'Jerry']
# 用列表生成式实现
list1 = [x.lower() for x in L if isinstance(x, str)]

# 用map()和filter()函数实现
list2 = list(map(lambda x: x.lower(), filter(lambda x: isinstance(x, str), L)))

我们在之前推送中聊过这类 map()和filter() 高阶函数的简单用法,高阶函数的英文为 Higher-order function ,怎么理解呢。我们从内置函数再来理解一下上面的提及到的函数名定义规则与变量一致,换句话说函数名也可以认为是一个变量。

那么,既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

高阶函数,我们以 map(f,list) #对列表内元素逐个处理,举个栗子:

# 对每一个元素进行平方计算
def f(x):
    return x*x

for i in map(f,[1,2,3,4,5,6,7]):
    print(i)

# 使用正则取列表中所有元素的关键字,省略部分代码
import re
def id(x):
    return re.findall(r'ORF\d+_(.*?):',x)[0]

for line in f:
    if line.startswith('P'):
        line = line.split('\t')
        line1 =list(map(id,line))
        print(line1)

比较来看,对于大部分需求来讲,使用列表生成式和使用高阶函数都能实现。这对于那些元素数量很大或无限的可迭代对象来说显然是更合适的,因为可以避免不必要的内存空间浪费。

enumerate函数

遍历列表时,课程中有一个函数值得关注 enumerate,该函数在循环遍历时会取到一个二元组,解包之后第一个值是索引,第二个值是元素,下面是一个简单的对比。

items = ['Python', 'Java', 'Go', 'Swift']

for index in range(len(items)):
    print(f'{index}: {items[index]}')

for index, item in enumerate(items):
    print(f'{index}: {item}')

第013课:列表和元组的应用

终于梳理了生成式的一些用法,同时从比较中引申出不同方法实现相同目的的用法,希望对你有启发~


参考资料

  jackfrued/ Python-Core-50-Courses

  https://www.cnblogs.com/yyds/p/6281453.html

往期推荐

ComplexHeatmap包更新支持pheatmap转换

  4种绘制带误差线的柱形图


生信技能树目前已经公开了三个生信知识库,记得来关注哦~

每周文献分享

https://www.yuque.com/biotrainee/weeklypaper

肿瘤外显子分析指南

https://www.yuque.com/biotrainee/wes

生物统计从理论到实践

https://www.yuque.com/biotrainee/biostat


友情宣传

强烈建议你推荐给身边的博士后以及年轻生物学PI,多一点数据认知,让他们的科研上一个台阶:

•生信爆款入门-全球听(买一得五)(第4期) ,你的生物信息学入门课。•数据挖掘第2期(两天变三周,实力加量),医学生/医生首选技能提高课。•生信技能树的2019年终总结 ,你的生物信息学成长宝藏•2020学习主旋律,B站74小时免费教学视频为你领路

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

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

相关文章

c语言高斯白序列x,C语言程序设计程设计指导书(晓庄).doc

C语言程序设计程设计指导书(晓庄)C语言程序设计课程设计任务书南京晓庄学院数学与信息技术学院2011-9-20一、C语言程序设计课程设计的目的说明1)复习巩固C语言的基础知识,进一步加深对C语言编程的理解和掌握;2)利用所学知识,理论和实际结合锻…

arduino智能风扇系统

研究方法与思路: 我们小组一开始找的是一个别人做好的项目,按键控制风扇挡位,不同挡位对应不同LED灯。但是实现过程中存在bug。而且仅仅通过按键控制风扇着实有局限性,因此我觉定用串口控制风扇开关的模式,输入1&…

verilog 生成块_如何高效的编写Verilog——终极版

为了高效的编写Verilog,通常有些编辑器插件可以自动生成代码,比如自动端口定义,自动连线,自动实例化等等。公司的环境有很好用的自动化插件,想给自己的电脑也整个怎么做。比如Emacs中有个插件叫verilog-mode。但是博主…

arduino串口输入改变模式模块

最新更新: 当时太嫩,做这个不知道arduino还有中断的方法,利用中断的方法可以比下面这种循环判断的方法更简单。 最近做了不少arduino智能系统,我发现在与用户交互的过程中,经常用到:通过在串口输入不同的值达到手动控…

android悬浮动态权限,Android 获取判断是否有悬浮窗权限的方法

现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作。Android 原生有自带权限管理的,只是被隐藏了。看android源码在android.app下就有个AppOpsManager类。类说明如下&a…

剩余 大小 查看内存_JVM的内存分配策略以及进入分代的条件

JVM的参数和知识点太多啦,记录下来,供自己随时回顾。java对象什么时候进入年轻代(新生代)?java对象什么时候进入老年代?对象优先在Eden分配大对象直接进入老年代空间分配担保机制java对象什么时候进入年轻代…

Arduino的串口结束符及串口缓冲区

文章目录1.深入理解缓冲区和Serial.available():2.深入理解串口结束符3.验证结论:1.深入理解缓冲区和Serial.available(): 运行下面的代码,我发现如果不在串口输入任何数字,就会一直显示“no”,输入一个数…

android 圆角边框边框渐变,支持边框、圆角、渐变色、透明度的GradientButton

最近在项目中发现好多Button背景颜色相同,但圆角大小不等的Button,这样就得写一大堆的shape或者selector,不便于管理及后期维护,于是乎变想能不能写一个支持边框、圆角、渐变色、透明度的万用Button呢。为了能够兼容button自带的属…

(斜率,点和线段)zzuli1196数星星(二)

题目描述 一天,小明坐在院子里数星星,Gardon就出了个难题给他,让他数数天上的星星最多有多少个是在同一条直线上的。天上的星星太多了,小明马上就看花了眼,你能写个程序来帮他计算么? 输入 首先输入一个整…

鸿蒙ide如何运行,深入浅析华为鸿蒙IDE安装与Hello World

一、系统安装1. 到官网下载HUAWEI DevEco Studio2. 安装二、创建项目创建项目目前还没有手机选项,所以我先选择一个电视:IDE的环境看起来和idea差不多,应该比较容易上手。从“关于”里也可以看到,确实是基于IDEA开源版本开发的。我…

springboot 上传文件解析入库_SpringBoot + easyexcel + WebUploader 实现文件上传并解析

1. WebUploader的使用,引入css和js,css其实没什么用:2. 定义上传框:选择文件开始上传3.相关jquery:// 文件上传jQuery(function() {var $ jQuery,$list $(#thelist),$btn $(#ctlBtn),state pending,uploader;uploa…

中快捷搜索_同事用1分钟,我用半小时,原来是因为这8个Word快捷键,秒杀一切办公技巧...

同事用1分钟,我用半小时,这8个Word快捷键,秒杀一切办公技巧​mp.weixin.qq.com文|王羽卒今天给小伙伴们分享几个实用又有效的快捷键,帮助快速完成工作,同事用了半小时,你1分钟就能解决哟&#x…

动态规划理论基础

(采用维特根斯坦的表述方式) 1.达成目的过程可以由不同阶段组成 2.阶段由达成目的的条件确定 (注:规定每一次走一步,第一步就是一个阶段) 3.每个阶段由不同的状态组成 4.状态是阶段中可能面临的所有情况 (注:第一步落脚点可能有多个&am…

荣耀x10max能不能升级为鸿蒙,荣耀终于放出大招!4部荣耀旗舰可升级鸿蒙,网友:终于等到了...

4月24~26日,华为将召开开发者大会,届时手机使用的鸿蒙系统将正式上线,华为和部分荣耀手机将会首先支持。其实,早在2月22日的华为Mate X2的发布会上,余承东就说过4月发布鸿蒙OS。华为并不想推出鸿蒙系统,如果…

android 7.0新增控件,自定义Android控件,封装Arcgis for Android测距测面积工具控件

控件的功能包括,测距、测面积、撤销、恢复、清除、完成六个功能。测距:在地图上绘制线段进行长度测量测面积:在地图上绘制一个面,进行面积测量撤销:撤销到上一步绘制,只能撤销未完成的测量恢复:…

cpython需要另外安装吗_在windows环境下安装和使用Python(CPython)

在windows环境下安装和使用Python(CPython)一、下载1.选择Python版本打开Windows版Python官网下载链接,选择Latest Python 3 Release - Python 3.8.3 。(推荐选择Python3.x,也可以选择其他版本)2.选择需要的Python类型在File中选择Windows x86-64 execut…

python模块:命名空间与重载模块

文章目录模块命名空间&#xff1a;重载模块&#xff1a;#module2.py print(starting to load...) import sys name42 def func():pass class klass:pass print(done loading.) >>> import module2 starting to load... done loading. >>> module2.sys <mo…

哪个html在大部分浏览器下是不隐藏的,前端浏览器兼容性问题总结

市场上浏览器种类很多&#xff0c;不同浏览器的内核也不尽相同&#xff0c;所以各个浏览器对网页的解析存在一定的差异。浏览器内核主要分为两种&#xff0c;一是渲染引擎&#xff0c;另一个是js引擎&#xff0c;内核更加倾向于说渲染引擎。常见的浏览器内核可以分四种&#xf…

多媒体分析与理解_如何设计一个出色的数字多媒体展厅?

展厅设计方案是了解每个多媒体设备的应用方法&#xff0c;那么如何让设备跟展厅结合一起&#xff0c;展示出我们想要的科技效果&#xff0c;核心就是用户体验度。今天华南数字科技的小编就为您介绍下数字多媒体展厅对用户体验方面的几个重点要素。1、细节展示不论多前卫的多媒体…

python模块:运行机制与编写方法

文章目录python模块的导入机制&#xff1a;python模块编写方法&#xff1a;#mod1: def printer(x):print(x) #mod2: print(hello) n1 #mod3: x1 y[2,3] >>> import mod1 >>> mod1.printer(hello) hello >>> from mod1 import printer >>> …