开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情
列表、元组、字典、集合
序列:一组存放多个值的连续的内存空间
在Python中,序列类型包括字符串、列表、元组、集合和字典
序列索引
举例:通过索引访问字符串
str="C语言中文网"
print(str[0],"==",str[-6])
print(str[5],"==",str[-1])
->结果C == C
->网 == 网
切片:访问序列中元素的另一种方法
语法格式sname[start : end : step]
语法解释:
- sname:表示序列的名称;
- start:表示切片的开始索引位置(包括该位置),默认为 0;
- end:表示切片的结束索引位置(不包括该位置),如果不指定,则默认为序列的长度; [可理解为左闭右开)
- step:表示隔几个位置(包含当前位置)取一次元素
举例:
str = "012345"
print(str[:2]) #取索引0-2之间的字符串,左闭右开也就是取的01
print(str[::2]) #隔两个索引取一次,结果是024
序列相加/相乘
str1 = "123"
str2 = "你好"
print(str1+str2+"世界")
-->"123你好世界"
list = [None]*5
print(list)
-->[None, None, None, None, None]
检查元素是否在序列中
用in就行,如
str5 = "你好世界"
print("你" in str5)
->True
也可以用not in来检查元素是否不在序列中。
序列相关的一些函数
| 函数 | 功能 |
|---|---|
| len() | 计算序列的长度,即返回序列中包含多少个元素。 |
| max() | 找出序列中的最大元素。注意,对序列使用 sum() 函数时,做加和操作的必须都是数字,不能是字符或字符串,否则该函数将抛出异常,因为解释器无法判定是要做连接操作(+ 运算符可以连接两个序列),还是做加和操作。 |
| min() | 找出序列中的最小元素。 |
| list() | 将序列转换为列表。 |
| str() | 将序列转换为字符串。 |
| sum() | 计算元素和。 |
| sorted() | 对元素进行排序。 |
| reversed() | 反向序列中的元素。 |
| enumerate() | 将序列组合为一个索引序列,多用在 for 循环中。 |
list列表
用[]中括号包围起来的,列表可以存储各种元素,同一个列表中也可以存储不同类型的元素。如
注意,在使用列表时,虽然可以将不同类型的数据放入到同一个列表中,但通常情况下不这么做,同一列表中只放入同一类型的数据,这样可以提高程序的可读性。
["nihao",1,2.3]
通过type可以查看数据类型,如
type(["nihao",1,2.3])
-><class 'list'> list类型
创建列表
#直接用中括号来创建
num = [1,2,3,4,5]
num1 = [] #空列表
# 使用list创建列表
list1 = list("hello")
#将区间转换成列表
range1 = range(1, 6)
list2 = list(range1) #输出的话就是[1,2,3,4,5]
访问列表元素
num = [1,2,3,4,5]
num[1] #索引访问
num[1:3:2] #切片访问
num[1:3:2]取到值是2,4,忘了的话可以再看一下前面的序列那部分。
删除列表
语法del 列表名
num = [1,2,3,4,5]#num是列表名,下面删除num列表
del num #就删除了
print(num) #输出一下num做测试,发现报错:num这个list不存在。
列表元素操作(添加、删除、修改、查找)
- 向列表中添加元素有:
append(),extend(),insert()几种方法。
举例(以append为例,extend一样):
num = [1,2,3]
num.append(4) #我们就把4这个元素添加到列表num末尾了
print(num) #->输出[1,2,3,4]
区别:append可以添加单个数字,而extend是不行的,就是说num.extend(4)这样是不合法的。append和extend添加元素只能添加到列表末尾的位置,而insert可以插在列表的任意位置(中间两边都可以)。
insert语法:listname.insert(插入的位置 , 插入的元素),举例:
num = [1,2,3]
num.insert(1,4) #意思是在索引为1的位置插入元素4
print(num) #->输出[1,4,2,3]
- 删除元素的方法有
del,pop(),remove(),clear()几个方法。
del删除元素的方式del 列表名[索引]删除某个元素,也可以使用切片的方法删除某一段元素del listname[start : end],举例如下
lang = ["Python", "C++", "Java", "PHP", "Ruby", "MATLAB"]
del lang[1: 4]
print(lang) #->['Python', 'Ruby', 'MATLAB']
pop删除元素
listname.pop(index)
#listname 表示列表名称,index 表示索引值。如果不写 index 参数,默认会删除列表中的最后一个元素
nums = [40, 36, 89, 2, 36, 100, 7]
nums.pop(3) #会把nums中第四个元素2删除
remove按照元素值删除元素
nums = [40, 36, 89, 2, 36, 100, 7]
nums.remove(89) #会将nums列表中是89的元素删除
clear删除列表中所有元素
nums = [40, 36, 89, 2, 36, 100, 7]
nums.clear() #nums = []
- 列表修改元素
修改元素就直接赋值就行了,如:
nums = [40, 36, 89, 2, 36, 100, 7]
#修改第 1~4 元素的值(不包括第4个元素)
nums[1: 4] = [45.25, -77, -52.5]
print(nums) #->[40, 45.25, -77, -52.5, 36, 100, 7]
#对空切片(slice)赋值,就相当于插入一组新的元素
nums = [40, 36, 89, 2, 36, 100, 7]
#在4个位置插入元素
nums[4: 4] = [-77, -52.5, 999]
print(nums) #->[40, 36, 89, 2, -77, -52.5, 999, 36, 100, 7]
使用切片语法赋值时,Python 不支持单个值,例如这个写法就是错误的:nums[4: 4] = -77,单元素赋值直接nums[4]=-77就行了。
- 列表查找元素
index() 方法用来查找某个元素在列表中出现的位置(也就是索引),如果该元素不存在,则会导致 ValueError 错误,所以在查找之前最好使用 count() 方法判断一下。
#语法
listname.index(obj, start, end)
其中,listname 表示列表名称,obj 表示要查找的元素,start 表示起始位置,end 表示结束位置。
start 和 end 参数用来指定检索范围:
(1)start 和 end 可以都不写,此时会检索整个列表;(2))如果只写 start 不写 end,那么表示检索从 start 到末尾的元素;(3)如果 start 和 end 都写,那么表示检索 start 和 end 之间的元素。
count() 方法用来统计某个元素在列表中出现的次数,基本语法格式为:
listname.count(obj)
其中,obj 表示要统计的元素。如果 count() 返回 0,就表示列表中不存在该元素,所以 count() 也可以用来判断列表中的某个元素是否存在。
nums = [40, 36, 89, 2, 36, 100, 7, -20.5, 36]
#统计元素出现的次数
print("36出现了%d次" % nums.count(36))
#判断一个元素是否存在
if nums.count(100):
print("列表中存在100这个元素")
else:
print("列表中不存在100这个元素")
上述代码运行结果:
-> 36出现了3次
-> 列表中存在100这个元素
tuple元组
和列表类似,元组也是由一系列按特定顺序排序的元素组成。区别:列表是可以改的,而元组一旦创建就不能修改了。
元组使用小括号()包含着的:(element1, element2, ... , elementn)。同列表一样,元组也可以存多种元素。
type( ("c.biancheng.net",1,[2,'a'],("abc",3.0)) ) #-> <class 'tuple'>
创建元组
元组用小括号创建,但小括号也不是必须的,只要将元素用逗号隔开,就会被默认视为元组,如下举例:
abc = ( "Python", 19, [1,2], ('c',2.0) )
course = "Python教程", "http://c.biancheng.net/python/"
print(abc) #-> ( "Python", 19, [1,2], ('c',2.0) )
print(course) #-> ("Python教程", "http://c.biancheng.net/python/")
注意:当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,否则 Python 解释器会将它视为字符串。
使用tuple创建元组
abc = tuple("hello")
print(tup1) #-> ('h', 'e', 'l', 'l', 'o')
#将列表转换成元组
list1 = ['Python', 'Java', 'C++', 'JavaScript']
tup2 = tuple(list1)
print(tup2) #->('Python', 'Java', 'C++', 'JavaScript')
元素访问(同list一样)
# 通过索引
tuplename[i]
# 通过切片方式
tuplename[start : end : step]
修改元组
因为元组是不能修改的,所以我们只是去创建了一个新的元组来代替旧的元组。如下:
tup = (100, 0.5, -36, 73)
print(tup) #->(100, 0.5, -36, 73)
#对元组进行重新赋值
tup = ('Shell脚本',"http://c.biancheng.net/shell/")
print(tup) #->('Shell脚本', 'http://c.biancheng.net/shell/')
删除元组del
del删除元组的方法与del删除列表是一样的,del 元组名。记住没办法删除元组元素,因为元组是不能修改的。
字典dict
字典是一种可变的、无序的序列,其中的元素以键值对的形式存在(就跟通过拼音查字典一样)。而列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。
字典中,习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”。
字典长这样:
a = {'one': 1, 'two': 2, 'three': 3} # { key: value, key: value }
type(a) #-> <class 'dict'>
创建字典
字典创建是用大括号{},语法格式就是这样:dictname = { key: value, key: value }。
同一字典中的各个键必须唯一,不能重复。
第二种方式是通过 fromkeys() 方法创建字典,举例:
## 语法 dictname = dict.fromkeys(list,value=None),其中,list 参数表示字典中所有键的列表(list);value 参数表示默认值,如果不写,则为空值 None。
knowledge = ['语文', '数学', '英语']
scores = dict.fromkeys(knowledge, 60)
print(scores) #-> {'语文': 60, '英语': 60, '数学': 60}
还有一种方式是通过dict来创建字典:
## 语法 a = dict(str1=value1, str2=value2, str3=value3)
## dict((('键',值),('键',值),('键',值))) 两种都行
a = dict(two=0.65, one=88, three=100, four=-59)
a = dict((('two',2), ('one',1), ('three',3)))
字典访问元素
第一种访问方法:dictname[key]
##如对上面字典a中key为two的元素进行访问就是这样
a['two'] #->会得到2
第二种使用get(key)
a.get('two') #跟上面一样的效果
删除字典
删除字典与删除列表、元组相同,都是使用del。语法:del 要删除的字典名。
字典元素操作
- 添加/修改/删除键值对
a = {'数学':95}
print(a)
#添加新键值对
a['语文'] = 89
print(a)
#修改键值对
a['语文'] = 100
print(a)
#删除键值对
del a['语文']
print(a)
上述运行结果
->{'数学': 95}
->{'数学': 95, '语文': 89}
->{'数学': 95, '语文': 100}
->{'数学': 95}
- 判断字典中是否存在指定键值对
a = {'数学': 95, '语文': 89, '英语': 90}
# 判断 a 中是否包含名为'数学'的key
print('数学' in a) # True
# 判断 a 是否包含名为'物理'的key
print('物理' in a) # False
运行结果;
->True
->False
字典中还有其他很多方法,用到了需要去查,比如返回字典中所有的键,返回所有值等等。
set集合
set集合的特征是用花括号{}包围,元素用逗号分隔的,这样{element1,element2,...,elementn},与字典明显不同。
在set集合中所有的数据都是唯一的(只有一份)。并且, set 集合是无序的,所以每次输出时元素的排序顺序可能都不相同。举例:
{1,2,1,(1,2,3),'c','c'}
#运行结果->{1, 2, 'c', (1, 2, 3)},可以看到剔除了重复元素
Python 中有两种集合类型,一种是 set 类型的集合,另一种是 frozenset 类型的集合,它们唯一的区别是,set 类型集合可以做添加、删除元素的操作,而 forzenset 类型集合不行。
创建集合
两种方式:使用大括号和set(),举例:
a = {1,'c',1,(1,2,3),'c'} #这是使用大括号的方式
print(a)
#这是使用set集合的方式,语法:setname = set(iteration)
##iteration 就表示字符串、列表、元组、range 对象等数据。
set1 = set("c.biancheng.net")
set2 = set([1,2,3,4,5])
print("set1:",set1)
print("set2:",set2)
运行结果:
->{1, 'c', (1, 2, 3)}
->set1: {'a', 'g', 'b', 'c', 'n', 'h', '.', 't', 'i', 'e'}
->set2: {1, 2, 3, 4, 5}
访问set元素
由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。
a = {1,'c',1,(1,2,3),'c'}
for ele in a:
print(ele,end=' ')
代码的意思是定义一个set集合a,然后用for循环将所有元素遍历出来(for循环后面再说)。ele是一个迭代变量(循环变量),迭代变量 ele会先后被赋值为a中的每个元素,并代入循环中使用。比如上面这个循环,迭代变量ele先等于1然后输出,又等于'c'然后输出...
运行结果如下:
->1 c (1, 2, 3)
删除set集合
del(a) #这样就会讲集合a删除
元素操作
- 添加/删除元素
添加元素用add方法,删除用remove方法。用法与前面列表很像,如下:
a = {1,2,3}
#添加元素
a.add((1,2))
print(a)
# 删除元素
a.remove(1)
print(a)
运行结果
->{(1, 2), 1, 2, 3}
->{(1, 2), 2, 3}
set集合也有很多其他方法,如清空所有元素、拷贝集合a到集合b这样子,用的时候去查就好。
frozenset 集合
set 集合是可变序列,程序可以改变序列中的元素;frozenset 集合是不可变序列,程序不能改变序列中的元素(这里有点像元组了)。set 集合中所有能改变集合本身的方法,比如 remove()、discard()、add() 等,frozenset 都不支持;set 集合中不改变集合本身的方法,fronzenset 都支持。
frozenset 集合的这些方法和 set 集合中同名方法的功能是一样的。
frozenset集合的创建:
fs = frozenset(['Java', 'Shell'])