目录
一、建立一个数据火车——列表
1、创建列表
2、列表元素的获取
3、列表元素的添加
4、列表元素的删除
5、列表元素的修改
二、列表的亲兄弟——元组
1、创建元组
2、元组元素的获取
3、元组和列表的差别
三、数据中的魔术师——字符串
1、创建字符串
2、字符的获取
3、字符串的处理
4、字符转义
5、原始字符串
6、多行字符串
7、列表、元组、字符串的通用操作
8、列表、元组、字符串总结
四、索引存储不再麻烦——字典
1、创建字典
2、字典键值对的添加
3、键值对的获取
4、字典键值对的删除
5、字典中键值对修改
6、什么时候用字典
五、比较专一的大火车——集合
1、创建集合
2、集合元素的添加
3、集合元素的获取
4、集合元素的删除
5、集合的运算
6、集合运算示例
7、什么时候用集合
8、获取字典和集合中的元素数量
9、字典和集合大总结
写在最后
Hello,你好呀,我是灰小猿,一个超会写bug的程序猿!
近期和大家分享总结了关于Python基础进阶的文章“【全网力荐】堪称最易学的Python基础入门教程”,然后得到了很多小伙伴的支持和肯定,但是同时很多刚开始学习的小伙伴在编程的时候还会遇见很多错误,所以就又为大家总结了一篇关于Python常见报错及其解决方案的文章“全网最值得收藏的Python常见报错及其解决方案,再也不用担心遇到BUG了!”。来帮助大家解决在前期学习中遇到的一些bug。感兴趣的小伙伴可以去阅读一下。
今天就继续来和大家分享Python基础入门之后的又一技术:列表、元组、字符串处理、字典和集合类型。文章较长,建议先收藏之后慢慢学习!
可能很多小伙伴在其他的编程语言中也见过这几个类型的使用,但是在Python对其的学习绝对会让你不虚此读!!!
我们之前学习了字符串和列表,除此之外 Python 中还内置有元组、字典、集合等常用的数据类型,它们都被用于存放批量数据。
存放批量数据用列表不就行了吗,为什么还要这么多数据类型?这是因为在不同的场景下,对数据的读取和修改效率以及内存使用情况的要求是不一样的,为了满足不同的场景需求,需要以不同的组织形式来存放数据。上面所述的那些数据类型,本质上就是不同的数据组织形式,Python 直接为我们提供了它们的现成的实现,我们拿来即可使用,轻而易举地获取各种不同的存放、访问和修改数据的能力。
列表、元祖、字典、集合、字符串这些数据类型中所存放的一个个单独的数据,叫作项(Item)或元素(Element)。这些数据类型除了可以存放元素以外,还能通过调用对象方法来操作管理其中的元素。
我们来详细学习下这五种内置数据类型。
列表是 Python 中非常常用的数据类型。之前的章节中我们学习过列表的一些基础知识,这个小节将会更深入地介绍列表的各种功能。
列表是用于存放若干元素的有序序列。列表使用方括号([]
)来表示,其中的元素写入方括号中,多个元素时用逗号分隔,如 [1, 'go', [0.1, 0.2]]
。它的元素可以是任意数据类型,甚至也可以是个列表。
元素之间有顺序关系,每个元素都有自己的位置,每个位置从 0 开始依次标号,这个表示位置的数字叫作索引。
列表被创建之后,我们可以对它做很多操作,包括添加元素,删除元素,修改元素,查找元素等。
我们可以很灵活地向列表添加元素,如以追加的形式向列表末尾添加一个元素;以插入的形式向列表的任意位置插入元素;或者将一个列表中的所有元素批量的添加到另一个列表中。
删除元素的方式同样很灵活。
元组和列表非常相似,也是用于存放元素的有序序列。它用的圆括号(()
)表示,元素写入圆括号中,多个元素时用逗号分隔,如 (1, 2, 3)
。
元组同样具有索引,索引使用方式与列表一致。其元素同样可以是任意类型。
看起来元组就是披着圆括号外衣的列表嘛!有什么区别?
元组创建完成后,便不能向其中添加元素,也不能修改和删除其中的任何一个元素。所以它与列表相比,只能查找元素,也就是说只具备读的功能,不具备写的功能。元组的这一特性叫作不可变(性)(Immutable),而列表是可变的(Mutable)。
我们可以看到,元组所具有的操作在使用方式上与和列表非常相似,甚至在一定程度上可以将元组看作是列表的精简版,但它们之间也有明显的差别。
我们在什么时候用列表,什么时候用元组?
列表还是元组,通常性能不是从它们中做选择的主要考虑因素,因为它们之间的性能差异不是很大。我们的选择通常围绕着可变和不可变的特性进行,当我们需要添加元素或修改元素时,使用列表;当我们希望所有元素在创建之后便不再改变,可使用元组。
字符串也是 Python 中非常常用的内置数据类型。我们之前学习过字符串的一些内容,现在来深入的了解下。
为什么要叫它是数据中的魔术师呢?原因是因为它可以转义成很多你想要的数据类型,接下来往下看你就知道了!
字符串是 Python 中用来存放字符序列的数据类型,其中的元素只能是字符。字符串使用单引号或双引号来表示,如 'pick'
,"cherry"
,通常我们首先使用单引号。
字符串是有序序列,可以使用索引来获取其中某个位置的元素。它是不可变的,被创建之后其中的元素(也就是字符)不能被修改和删除。
字符串自带的方法非常多,除了上面介绍的几个之外还有四十多个,这是因为字符处理是编程时的一项高频工作。Python 将这些字符处理相关的功能以方法的形式集成在字符串里。
这里列举几个常见的方法:
注意上面的这些字符处理功能,对字符串作处理后都是返回一个新的字符串,而不会直接修改原有的字符串。为什么呢?字符串不可变呀!
我们在创建字符串时,有一些字符是没法直接在引号中表示的,如单引号或双引号,因为这和表示字符串本身的符号冲突了,如:
string = 'I’m happy’ File “”, line 1 string = ‘I’m happy’ ^ SyntaxError: invalid syntax
抛出 SyntaxError
语法错误异常,因为 Python 将 string = 'I'
看作字符串的赋值,而后面的 m happy'
就无法解析了,因为不符合任何语法。
这时就需要使用字符转义了,我们在这类无法直接在字符串中表示的字符前加上 \
符号,形如 \'
,这样 Python 在解析时就能理解这是嵌入在字符串中的单引号 '
:
string = 'I\'m happy’ string "I’m happy"
像 \'
这样在前面加了反斜杠(\),为了能在字符串中正常表示的字符,叫作转义字符。而这个转化的行为叫作字符转义。
与单引号的用法相同,双引号用 \"
来转义。
字符串中的 \
用来做字符转义了,那怎么在字符串中表示斜杆 \
这个字符呢?使用 \\
,将斜杆 \
转义一下。除此之外,有一些空白符号也需要用转义字符来表示,因为我们没办法直接在字符串中表示它们,如常见的换行(\n
),制表符(\t
),回车(\r
)。
常用的转义字符 | 含义 |
---|---|
\' | 单引号 |
\" | 双引号 |
\ | 反斜杠 |
\n | 换行符 |
\t | 制表符(Tab) |
\r | 回车 |
举个例子,如果在字符串使用了 \n
,那么在用 print()
输出字符串的时候,这个字符串会被换行输出。如:
print(‘第一行\n第二行’) 第一行 第二行
使用 \n
换行符使得我们能够在一行的字符串来表示多行的内容。
说明:转义字符虽然在书写时使用了两个字符,但是在程序中它只是一个字符。可以自己来试验下:len(’\n’) 1 len(’\’’) 1
如果我们就想在字符串中表示 \n
这两个字符,而不是让它表示换行,该怎么办?有两种方式:
\\n
,将 \n
前面的反斜杠转义print(‘第一行\n第二行’)
第一行\n第二行原始字符串就是在字符串的起始引号前加上一个 r
或 R
字母,这样字符串中的内容将不会被转义,将按照原样输出。使用方法:
r'字符串内容'
print(r’第一行\n第二行’) 第一行\n第二行
我们之前所使用的字符串都被书写成一行,要想让字符串可以跨行书写,写成多行的形式,有两种方法:
我们把列表、元组、字符串统称为序列。
len()
函数获取序列长度letters = (‘a’, ‘b’)
len(letters)
2letters = ‘abcd’
len(letters)
4
[起始索引:结束索引]
表示。切片其实代表一个索引区间,这个区间是一个左闭右开区间,该区间内的所有元素作为子序列被返回。如:numbers = (1, 2, 3, 4, 5)
numbers0:2
(1, 2)
numbers2:4
(3, 4)letters = ‘abcd’
letters1:5
’bcd’
+
符号来拼接两个序列letters_1 = (‘a’, ‘b’)
letters_2 = (‘c’, ‘d’, ‘e’)
letters_1 + letters_2
(‘a’, ‘b’, ‘c’, ‘d’, ‘e’)letters_1 = ‘ab’
letters_2 = ‘cde’
letters_1 + letters_2
’abcde’
*
符号来重复序列中的元素letters = (‘a’, ‘b’)
letters * 3
(‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘b’)letters = ‘abcd’
letters * 2
’abcdabcd’
注意上面的操作结果都是返回一个新的序列,不会对修改序列的内部元素。
列表、元组、字符串都是有序序列,都可以使用索引。
列表和元组中可以存放任意数据类型的元素,而字符串中只能存放字符。
列表是可变的,而元组和字符串是不可变的。
字典是一种用来存放若干键值对的数据类型。
什么是键值对呢?键值对就是两个对象,其中一个是用来做定位的数据,叫做键(Key),另一个是要存放的数据,叫做值(Value)。在字典中,键值对作为一个整体被存放,我们可以通过键来快速获取到对应的值。
在 Python 中字典用花括号({}
)来表示,键值对以 键:值
的方式写入花括号中,有多个键值对时用逗号分隔。
如 {'010': 'beijing', '021': 'shanghai'}
便是一个字典,其中包含两个键值对
'010': 'beijing'
'021': 'shanghai'
使用时,我们可以通过 '010'
快速查询到其对应的值是 'beijing'
。这就好比现实中的一本字典一样,通过拼音或偏旁来映射一个具体的字词,以此来实现字词的快速查找,而这个拼音或偏旁就相当于 Python 字典的键,而字词就相当于 Python 字典的值,它们在字典中是映射关系。
Python 字典中的键是有要求的,需要是不可变的类型,如元组、字符串、数字。而字典中的值可以是任意类型。字典本身是可变的,我们可以向其中添加、删除、修改键值对。
因为字典不是序列,更不是有序的,所有它没有列表那样的索引,也不能保证每个键值对的存放次序。
字典的显著优势是可以通过键快速地查询数据。字典中的元素以键值对的形式存在,使用时通过键来获取和修改值,由于字典内部的特殊实现,字典通过键获取值的效率非常高。
如果我们希望将批量的数据存放起来,并且在需要时能以很高的执行效率来获取其中某个指定的数据,这时就可以使用字典。除此之外,如果我们想在程序中暂时维护一个映射关系,也可以使用字典,因为字典本质上就是一个映射关系。
如,我们可以将城市名和对应的区号保存在字典中,这样就可以通过城市名快速地查询到其区号,而不需要进行遍历。
area_codes = {
'北京': '010',
'上海': '021',
'天津': '022',
'重庆': '023',
'沈阳': '024',
'南京': '025',
'武汉': '027',
'成都': '028',
}
area_codes‘成都’ ‘028’ area_codes‘南京’ ‘025’
集合是一个用于存放批量元素的数据类型,它不是有序的,其中的元素没有顺序关系。集合中的元素没有重复,重复的元素将被自动剔除最终只留下一个。
集合也是用花括号({}
)来表示,不同于字典的是,花括号中放的是一个个数据,而不是键值对。
集合是可变的,我们可以向其中添加、删除、修改元素。
集合不能像列表那样通过索引来获取元素,也不能像字典那样通过键来获取值,集合没法直接获取到某个指定的元素。想要获取元素,只能通过遍历的方式。
虽然集合不能直接获取到元素,但是我们依然可以用 in
关键字来判断元素是否存在于集合中。
看到这里你可能会想,集合不就是阉割版的列表嘛?不是的,集合的功能不止于此。
Python 中的集合和数学中的集合颇为相似,首先集合的所有元素都是唯一的,不存在重复;此外集合有子集、超集的概念,也可以进行交集、并集、差集的运算。
集合运算在编程时有什么用呢?以差集为例举个例子。
假如大学里有一个班,班里同学的花名册是「赵大,钱二,孙三,李四,周五,吴六,郑七,王八」。有一天上课,老师要求同学们在一张白纸上签到,大家陆续写上了自己的名字,上面有「周五,李四,王八,赵大,钱二,冯九,陈十」。哪些人缺席了呢?
要判断哪些人缺席了,通常的做法时,逐一从签到表上取出名字,然后去花名册上寻找并做标记,最终花名册上没被标记的名字便是缺席的。有些麻烦,这可苦了助教了。
我们可以用 Python 集合来快速解决这个问题。将花名册上的名字保存在集合中,将签到表上的名字保存在另一个集合中,然后求一下差集。如下:
花名册 = {‘赵大’, ‘钱二’, ‘孙三’, ‘李四’, ‘周五’, ‘吴六’, ‘郑七’, ‘王八’} 签到表 = {‘周五’, ‘李四’, ‘王八’, ‘赵大’, ‘钱二’, ‘冯九’, ‘陈十’} 花名册 - 签到表 {‘吴六’, ‘孙三’, ‘郑七’}
吴六,孙三,郑七没来!
我们用反过来用 签到表 - 花名册
看看:
签到表 - 花名册 {‘陈十’, ‘冯九’}
还有两个旁听生!
集合非常重要的一个特性是元素无重复,每个元素都是唯一的,重复的元素将被自动剔除(去重)。
所以如果我们需要存放一系列的数据,并且不希望其中出现重复,那么就可以使用集合。
另外如果想计算两个数据集的交集、并集、差集,使用集合来承载数据再合适不过了,集合自带的集合运算能轻松解决这些问题。
我们可以通过 len()
函数来获取字典中的键值对数量和集合中的元素数量。
codes = {‘beijing’: ‘010’, ‘shanghai’: ‘021’} len(codes) 2numbers = {1, 2, 3, 4} len(numbers) 4
字典是一种用来存放若干键值对的数据类型,可通过键来快速查找值。
字典的键需要是不可变的类型,如数字,字符串和元组。字典的值可以是任意类型。字典本身是可变的,所以可向其中添加、修改、删除键值对。
集合是一个用于存放批量元素的序列。它不是有序的,且元素不会有重复。集合也是可变的,我们可以向其中添加、删除、修改元素。