python基础--切片、迭代、列表生成式
原文地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317568446245b3e1c8837414168bcd2d485e553779e000
一.切片
Python提供了切片(Slice)操作符,能大大简化操作。
1.定义列表
- names = ["Ronaldo","Messi","Torres"]
- data = [["cpu","i7"],["gpu","gtx1080"],["ram","16GBddr5"]]
2.访问列表内的元素。下标从0开始计数
- >>> names[0]
- Ronaldo
- >>> names[-1] #倒序取
- Torres
- >>> data[0][1]
- i7
- >>> data[-2][0] #倒序取
- gpu
- >>> data[-2][-1]
- gtx1080
3.切片操作
- >>>names = ["Ronaldo","Messi","Torres","Gerrard","Suarez"]
- >>>names[2:3] #取下标介于2到3之间的元素,不包含下标为2、3的元素》
- ['Torres', 'Gerrard']
- >>>names[:3] #等价于names[0:3]
- ['Ronaldo', 'Messi', 'Torres']
- >>>names[2:] #取下标2到最后一个值
- ['Torres', 'Gerrard', 'Suarez']
- >>>names[0::2] #每隔2个元素取一次
- ['Ronaldo', 'Torres', 'Suarez']
- >>>names[::2 ]
- ['Ronaldo', 'Torres', 'Suarez']
- >>>names[1::3] #从下标1开始每隔3个元素取一次
- ['Messi', 'Suarez']
- >>>names[1:4:2] #从下标1-4之间,每隔2个元素取一次
- ['Messi', 'Gerrard']
- >>>names[:] #原样复制一个list
- ["Ronaldo","Messi","Torres","Gerrard","Suarez"]
二.迭代
如果给定一个list或tuple,我们可以通过for
循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
在Python中,迭代是通过for ... in
来完成的,而很多语言比如C语言,迭代list是通过下标完成的。
Python的for
循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。
list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:
- >>> d = {'a': 1, 'b': 2, 'c': 3}
- >>> for key in d:
- ... print(key)
- ...
- a
- c
- b
因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values()
,如果要同时迭代key和value,可以用for k, v in d.items()
。
由于字符串也是可迭代对象,因此,也可以作用于for
循环:
- >>> for ch in 'ABC':
- ... print(ch)
- ...
- A
- B
- C
通过collections模块的Iterable类型判断一个对象是否是可迭代对象:
- >>> from collections import Iterable
- >>> isinstance('abc', Iterable) # str是否可迭代
- True
- >>> isinstance([1,2,3], Iterable) # list是否可迭代
- True
- >>> isinstance(123, Iterable) # 整数是否可迭代
- False
Python内置的enumerate
函数可以把一个list变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身:
- >>> for i, value in enumerate(['A', 'B', 'C']):
- ... print(i, value)
- ...
- 0 A
- 1 B
- 2 C
- 上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:
- >>> for x, y in [(1, 1), (2, 4), (3, 9)]:
- ... print(x, y)
- ...
- 1 1
- 2 4
- 3 9
三.列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可以用list(range(1, 11))
:
- >>> list(range(1, 11))
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]
怎么做?方法一是循环:
- >>> L = []
- >>> for x in range(1, 11):
- ... L.append(x * x)
- ...
- >>> L
- [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
- >>> [x * x for x in range(1, 11)]
- [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
写列表生成式时,把要生成的元素x * x
放到前面,后面跟for
循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
- >>> [x * x for x in range(1, 11) if x % 2 == 0]
- [4, 16, 36, 64, 100]
还可以使用两层循环,可以生成全排列:
- >>> [m + n for m in 'ABC' for n in 'XYZ']
- ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
三层和三层以上的循环就很少用到了。
运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:
- >>> import os # 导入os模块,模块的概念后面讲到
- >>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
- ['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']
for
循环其实可以同时使用两个甚至多个变量,比如dict
的items()
可以同时迭代key和value:
- >>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
- >>> for k, v in d.items():
- ... print(k, '=', v)
- ...
- y = B
- x = A
- z = C
因此,列表生成式也可以使用两个变量来生成list:
- >>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
- >>> [k + '=' + v for k, v in d.items()]
- ['y=B', 'x=A', 'z=C']
最后把一个list中所有的字符串变成小写:
- >>> L = ['Hello', 'World', 'IBM', 'Apple']
- >>> [s.lower() for s in L]
- ['hello', 'world', 'ibm', 'apple']
python基础--切片、迭代、列表生成式的更多相关文章
- python 基础 切片 迭代 列表生成式
对list 进行切片 如列表 L = ['Adam', 'Lisa', 'Bart', 'Paul'] L[0:3] ['Adam', 'Lisa', 'Bart'] L[0:3]表示,从索引0开始取 ...
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...
- Python 函数 切片 迭代 列表生成器
函数 编写 定义一个函数要用def语句 def sum(i,n): ⚠有冒号 返回多值 实际上是返回一个tuple 定义默认参数 默认参数的作用是简化调用 def ...
- python高级特性:切片/迭代/列表生成式/生成器
廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...
- 『Python基础-8』列表
『Python基础-8』列表 1. 列表的基本概念 列表让你能够在一个地方存储成组的信息,其中可以只包含几个 元素,也可以包含数百万个元素. 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...
- python基础——切片
python基础——切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', ...
- 初学Python(十)——列表生成式
初学Python(十)--列表生成式 初学Python,主要整理一些学习到的知识点,这次是列表生成式. # -*- coding:utf-8 -*- ''''' 列表生成式 ''' #一行代码表达所有 ...
- Python笔记(九)_切片、列表生成式
切片 mylist[:3] 取前3位元素,0可省略不写 mylist[-4:] 取后4位元素,0可省略不写 mylist[2:4] 从第2个开始取,取到第4个,但第4个不取,取的元素值为4-2=2 m ...
- Python基础学习Day4 列表的使用方法、range 用法、in用法
一.列表 1.1列表:python基础数据类型之一:其他语言也有列表的概念,js 数组,可索引 ,可切片,可加步长 1.2列表的索引,切片,切片+ 步长 结果: 注意:列表里元素的数据类型,就是它本身 ...
随机推荐
- P/Invoke 技术
.NET 互操作 首先推荐一本书<精通.NET 互操作> ,这本书是目前中文资料里讲 互操作最详尽的书了. 做系统集成项目的同学应该都和设备打过交道(如视频设备:海康.大华等),在大多数情 ...
- springboot备份mysql后发送邮件并删除备份文件,支持win和Linux
首先加入springboot的邮箱依赖 <!--邮箱依赖--> <!-- https://mvnrepository.com/artifact/org.springframework ...
- LeetCode 141. 环形链表(Linked List Cycle) 19
141. 环形链表 141. Linked List Cycle 题目描述 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 ...
- [Oracle] - 使用 EXP / IMP 对数据库进行备份与还原
只有Oracle客户端环境,如何完整备份数据库? 方法1:在本地搭建与目标环境相同版本的服务端,远程访问执行导出命令.这种方式远程备份速度较慢(VPN环境下测试). 方法2:登陆客户端,先导出数据库表 ...
- (四)Spring Boot官网文档学习
文章目录 关于默认包的问题 加载启动类 配置 Bean管理和依赖注入 @SpringBootApplication Developer Tools 关于 Developer Tools 的一些细节 原 ...
- MyBatis代码生成器(maven插件方式和控制台命令运行方式)
代码生成器的作用: 1.生成domain 2.生成mapper接口 3.生成mapper映射文件 准备工作:导入MyBatis所需要的包 第一步:在src/main/resources(必须)目录下创 ...
- 第四章 函数之lambda 表达式和内置函数
4.5 lambda 表达式 用于表示简单的函数. # 三元运算,为了解决简单的if else的情况,如:if 1 == 1: a = 123else: a = 456# 相当于a = 1 ...
- Python re模块前的正则表达式常用语法小总结
一.正则表达式: (1).正则表达式是干什么的 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或 ...
- Django框架学习易错和易忘点
一.get在几处的用法 1.获取前端数据 request.POST.get('xxx') #当存在多个值时,默认取列表最后一个元素:所以当存在多个值时,使用getlist 2.获取数据库数据 mode ...
- 解决Html页面缓存
对于一个html页面,缓存分3部分,一个是页面内容,一个是css样式,一个是JS文件 CSS和JS文件缓存 <link rel="stylesheet" type=" ...