python列表操作程序_Python列表操作,比较常见的10个问题

列表是比较常用的数据类型之一,本文整理了 StackOverflow 上关于列表操作被访问较多的10个问答,如果你在开发过程中遇到这些问题,不妨先思考一下如何解决。

1、迭代列表,如何访问列表下标索引

普通版:

items = [8, 23, 45]

for index in range(len(items)):

print(index, "-->", items[index])

>>>

0 --> 8

1 --> 23

2 --> 45

优雅版:

for index, item in enumerate(items):

print(index, "-->", item)

>>>

0 --> 8

1 --> 23

2 --> 45

enumerate 还可以指定元素的第一个元素从几开始,默认是0,也可以指定从1开始:

for index, item in enumerate(items, start=1):

print(index, "-->", item)

>>>

1 --> 8

2 --> 23

3 --> 45

2、append 与 extend 方法有什么区别

append表示把某个数据当做新元素追加到列表的最后面,它的参数可以是任意对象

x = [1, 2, 3]

y = [4, 5]

x.append(y)

print(x)

>>>

[1, 2, 3, [4, 5]]

extend 的参数必须是一个可迭代对象,表示把该对象里面的所有元素逐个地追加到列表的后面

x = [1, 2, 3]

y = [4, 5]

x.extend(y)

print(x)

>>>

[1, 2, 3, 4, 5]

# 等价于:

for i in y:

x.append(i)

3、检查列表是否为空

普通版:

if len(items) == 0:

print("空列表")

或者

if items == []:

print("空列表")

优雅版:

if not items:

print("空列表")

4、如何理解切片

切片用于获取列表中指定范围的子集,语法非常简单

items[start:end:step]

从 start 到 end-1 位置之间的元素。step 表示步长,默认为1,表示连续获取,如果 step 为 2 就表示每隔一个元素获取。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a[3:8] # 第3到第8位置之间的元素

[4, 5, 6, 7, 8]

>>> a[3:8:2] # 第3到第8位置之间的元素,每隔一个元素获取

[4, 6, 8]

>>> a[:5]   # 省略start表示从第0个元素开始

[1, 2, 3, 4, 5]

>>> a[3:]  # 省略end表示到最后一个元素

[4, 5, 6, 7, 8, 9, 10]

>>> a[::]  # 都省略相当于拷贝一个列表,这种拷贝属于浅拷贝

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

5、如何拷贝一个列表对象

第一种方法:

new_list = old_list[:]

第二种方法:

new_list = list(old_list)

第三种方法:

import copy

# 浅拷贝

new_list = copy.copy(old_list)

# 深拷贝

new_list = copy.deepcopy(old_list)

6、如何获取列表中的最后一个元素

索引列表中的元素不仅支持正数还支持负数,正数表示从列表的左边开始索引,负数表示从列表的右边开始索引,获取最后一个元素有两种方法。

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> a[len(a)-1]

10

>>> a[-1]

10

7、如何对列表进行排序

列表排序有两种方式,一种是列表自带的方法 list.sort(),一种是内建函数 sorted(list)。复杂的数据类型可通过指定 key参数进行排序。由字典构成的列表,根据字典元素中的age字段进行排序:

items = [{'name': 'Homer', 'age': 39},

{'name': 'Bart', 'age': 10},

{"name": 'cater', 'age': 20}]

items.sort(key=lambda item: item.get("age"))

print(items)

>>>

[{'age': 10, 'name': 'Bart'}, {'age': 20, 'name': 'cater'}, {'age': 39, 'name': 'Homer'}]

列表有 sort方法,用于对原列表进行重新排序,指定 key 参数,key 是匿名函数,item 是列表中的字典元素,我们根据字典中的age进行排序,默认是按升序排列,指定 reverse=True 按降序排列

items.sort(key=lambda item: item.get("age"), reverse=True)

>>>

[{'name': 'Homer', 'age': 39}, {'name': 'cater', 'age': 20}, {'name': 'Bart', 'age': 10}]

如果不希望改变原列表,而是生成一个新的有序列表对象,那么可以内置函数 sorted ,该函数返回新列表

items = [{'name': 'Homer', 'age': 39},

{'name': 'Bart', 'age': 10},

{"name": 'cater', 'age': 20}]

new_items = sorted(items, key=lambda item: item.get("age"))

print(items)

>>>

[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}, {'name': 'cater', 'age': 20}]

print(new_items)

>>>

[{'name': 'Bart', 'age': 10}, {'name': 'cater', 'age': 20}, {'name': 'Homer', 'age': 39}]

8、如何移除列表中的元素

删除列表中的元素有三种方式

remove 移除某个元素,而且只能移除第一次出现的元素

items = [{'name': 'Homer', 'age': 39},

{'name': 'Bart', 'age': 10},

{"name": 'cater', 'age': 20}]

new_items = sorted(items, key=lambda item: item.get("age"))

print(items)

>>>

[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}, {'name': 'cater', 'age': 20}]

print(new_items)

>>>

[{'name': 'Bart', 'age': 10}, {'name': 'cater', 'age': 20}, {'name': 'Homer', 'age': 39}]

del指令:根据指定的位置移除某元素

>>> a = [3, 2, 2, 1]

# 移除第一个元素

>>> del a[1]

[3, 2, 1]

# 当超出列表的下表索引时,抛出IndexError的异常

>>> del a[7]

Traceback (most recent call last):

File "", line 1, in 

IndexError: list assignment index out of range

pop函数 与del 类似,但是 pop 函数可以返回移除的元素

>>> a = [4, 3, 5]

>>> a.pop(1)

3

>>> a

[4, 5]

# 同样,当超出列表的下表索引时,抛出IndexError的异常

>>> a.pop(7)

Traceback (most recent call last):

File "", line 1, in 

IndexError: pop index out of range

9、如何连接两个列表

listone = [1, 2, 3]

listtwo = [4, 5, 6]

mergedlist = listone + listtwo

print(mergelist)

>>>

[1, 2, 3, 4, 5, 6]

列表实现了 + 的运算符重载,使得 + 不仅支持数值相加,还支持两个列表相加,只要你实现了 对象的 __add__操作,任何对象都可以实现 + 操作,例如:

class User(object):

def __init__(self, age):

self.age = age

def __repr__(self):

return 'User(%d)' % self.age

def __add__(self, other):

age = self.age + other.age

return User(age)

user_a = User(10)

user_b = User(20)

c = user_a + user_b

print(c)

>>>

User(30)

10、如何随机获取列表中的某个元素

import random

items = [8, 23, 45, 12, 78]

>>> random.choice(items)

78

>>> random.choice(items)

45

>>> random.choice(items)

12

在过去的几十年间,大量的编程语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtime cost)各不相同。

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

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

相关文章

ViewData 和 ViewBag 到底有什么区别?

咨询区 user469652请问 ASP.NET MVC 中的 ViewBag 和 ViewData 到底哪一个好,在实际项目开发中应该选择哪一个?回答区 Naresh RavlaniViewData它需要对复杂类型进行类型转换并且还要检查null值来防止错误。ViewBag它不需要对 复杂类型 进行类型转换。考虑…

更新整理本人所有博文中提供的代码与工具(C++,2013.11)

为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载。C1、《通用高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布》 《基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计…

Android之用AccessibilityService实现红包插件

微信红包自打出世以来就极其受欢迎,抢红包插件可谓红极一时.今天,我们重新谈谈抢红包插件的哪些事儿.本质上,抢红包插件的原理不难理解,其过程就是在收到红包时,自动模拟点击.做过自动化UI测试的童鞋应该非常熟悉了.那么问题来了,我们怎么知道有没有红包,又怎么模拟点击操作呢?…

【软件周刊】D语言卷土重来,Vue.js 应获 1024 个赞,小薇可以一键启动了

2019独角兽企业重金招聘Python工程师标准>>> 一、 前端相关 1. Vue.js — Vue.js 这次的更新比较频繁,才刚刚更新完 2.0.4 版本不久,立马就更新出了 2.0.5 版本。这次发布的 2.0.4 版本主要的亮点是 SSR 性能改进了 20%,然后接着更…

LINUX内核完全注释

学习教材:LINUX内核完全注释,内核版本0.11,修正版V3.0 赵炯编著 参考教材:UNIX操作系统设计--M. J. Bach, programming the 80x86 --John H. Crawford MINIX操作系统的设计与实现--Andrew S.Tanenbaum --Tanenbaum 学…

Autofac实现拦截器和切面编程

Autofac.Annotation框架是我用.netcore写的一个注解式DI框架,基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址:https://github.com/yuzd/Autofac.Annotation上期说了Autofac实现有条件的DI本期讲的是最新…

python好用的模块和包_Python模块和包详细讲解与实例分析

一丶模块我们经常说模块模块的,究竟什么是模块呢?一个模块就是包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀但其实import加载的模块分为四个通用类别:1.使用Python编写的代码(.py文件)2.已被编译为共享库或DLL的C或C扩展3.包好一组模块的包4.使用C编写并链接…

C语言之struct A *b和struct A c区别

struct A *b; 是指针 struct A c; 是定义了一个struct A对象,你得提供相应的结构体的具体定义 结构体A没有具体的定义,当struct A c时,实际是定义一个结构体变量,这是要分配存储空间的,空间大小依结构体中具体的变量而定,如果没有具体的结构体定义,编译器不知道结构体到底是什…

JS的类型转换

当string,number函数不被用作构造函数的可以当成转换函数 如 string(false),number(‘3’),boolean([]) Object(3) new number(3); 除了NULL和undefined以外任何值都具有toString()方法 JS 在执行程序的时候会自动检测表达式来进行变量转换。 显示转换变量&#xf…

linux 下执行.sh文件总是提示permission denied

今天执行.sh文件懂得时候提示 permission denied错误 解决办法: chmod 777 file.sh 或者 chmod+x file.sh 比如我们执行一个变量加1的时候,不能这样写 a = 1; a = $($a +1) echo $a 需要这样写: a=1 a=$(($a+1)) echo $a 还有写sh文件的时候代码之间不需要留下空格…

ahjesus解决win下U盘无法写入的问题

可能是由于不同品牌的U盘出厂时磁盘分区和格式化方式不同而引起的兼容性问题。解决方案如下 启动cmd。输入diskpart,启动DISKPART工具 在DISKPART窗口中输入以下命令: >list disk (此命令是列出所有磁盘驱动器,请务必看清楚你的…

[探索 .NET 6]01 揭开 ConfigurationManager 的面纱

在这个系列中,我将探索一下 .NET 6 中的一些新特性。已经有很多关于 .NET 6 的内容,包括很多来自 .NET 和 ASP.NET 团队本身的文章。在这个系列中,我将探索一下这些特性背后的一些代码。在这第一篇文章中,来研究一下 Configuratio…

mysql锁表_MySQL中Alter table 你不知道的性能问题

前言:MySQL 的大表运维总是令人头疼的一件事,特别是大表表结构的修改尤为困难。首先,alter table 的process不可被kill , 一旦执行就不可回退。其次,大多数的alter table操作都会涉及 lock --- copy to new table --- …

打印文件前,千万记得把弹窗叉掉!!!

1 父母能有多迷信?(素材来源网络,侵删)▼2 打印前千万记得把弹窗关掉(素材来源网络,侵删)▼3 挺好的(素材来源网络,侵删)▼4 饭桌上,领导叫你去…

Java队列集合的性能测试

同时开10个线程存入和取出100万的数据&#xff0c;结论如下&#xff1a; DoubleBufferedQueue < ConcurrentLinkedQueue < ArrayBlockingQueue < LinkedBlockingQueue 执行结果如下&#xff1a; 100万 DoubleBufferedQueue入队时间&#xff1a;9510 出队时间&#xff…

linux之man命令用法入门

man命令的解释: man的全称是manual,手册的意思,所以man命令有帮助解释其它命令的作用 基本用法: man + 命令 比如: man pwd 就会出现下面信息 PWD(1) User Commands PWD(1) //注意括号中的数字 NAME //关于命令的名次和说明pwd - print name of current/work…

Node webkit启动最大化窗口

<!DOCTYPE html> <html> <head> </head> <body> <p style"text-align:center;margin-top:10%;color:green;font-weight:bold;font-size:12px">正在加载中...</p> <script language"javascript" …

高效的动态URL限流实现

访问限流对于一个网关来说是个比较重要的功能&#xff0c;它可以根据不同服务的处理能力来控制相关的访问量&#xff0c;从而保障服务更可靠地运行。但是URL控制的路径比较多还加上可动态添加删除&#xff0c;大量的访问匹配会很容易引起性能上的问题&#xff0c;接下来讲解一下…