序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。

为了更形象的认识序列,可以将它看做是一家旅店,那么店中的每个房间就如同序列存储数据的一个个内存空间,每个房间所特有的房间号就相当于索引值。也就是说,通过房间号(索引)我们可以找到这家旅店(序列)中的每个房间(内存空间)。

Python 中,序列类型包括字符串、列表、元组、集合和字典,这些序列支持以下几种通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。
字符串也是一种常见的序列,它也可以直接通过索引访问字符串内的字符。

列表(list)

列表是由[]括起,”,”分隔的序列

Python内置的数据类型:列表(list)
list是一种有序的集合,可以随时添加和删除其中的元素。
列表是可变的(mutable)——可以改变列表的内容。
列表是一种容器类型:

  • 可以包含任意对象的有序集合,通过索引进行访问其中的元素,是一种可变对象,其长度可变
  • 支持异构和任意嵌套
  • 支持在原处修改

定义

  1. list1 = ['Google','Huawei',1997,2000]
  2. list2 = [1,2,3,4,5]
  3. list3 = ['a','b','c','d']
  4. #type获取类型为:<class 'list'>
  5. 同样可以用len()函数可以获得list元素的个数:
  6. print(len(list1))
  7. 4

索引


序列的索引与之前的字符串索引相似,都是从0开始

  1. list1 = ['Google','Huawei',1997,2000]
  2. list2 = [1,2,3,4,5]
  3. list3 = ['a','b','c','d']
  4. #嵌套
  5. list4 = ["all of them",list1,list2,list3]
  6. print(list4)
  7. ['all of them', ['Google', 'Huawei', 1997, 2000], [1, 2, 3, 4, 5], ['a', 'b', 'c', 'd']]
  8. #序列的索引都是从0开始,-1代表最后一个
  9. print(list1[0])
  10. print(list1[-1])
  11. print(list1[1:4])
  12. Google
  13. 2000
  14. ['Huawei', 1997, 2000]

使用append()或insert()方法
append方法用于在列表末尾追加新的对象
insert 方法用于将对象插入到列表中

  1. list1 = ['Google','Huawei',1997,2000]
  2. #append追加新元素2010
  3. list1.append(2010)
  4. print(list1)
  5. print(list1[-1])
  6. ['Google', 'Huawei', 1997, 2000, 2010]
  7. 2010
  8. #insert在第三个位置插入'w'
  9. list2 = [1,2,3,4,5]
  10. list2.insert(2,'W')
  11. print(list2)
  12. [1, 2, 'W', 3, 4, 5]

pop方法
要删除list末尾的元素,用pop()方法
要删除指定位置的元素,用pop(i)方法,其中i是索引位置
pop是有返回值的,返回值为该元素的值

  1. #pop()删除末尾的元素
  2. list3 = ['a','b','c','d']
  3. list3.pop()
  4. print(list3)
  5. ['a', 'b', 'c']
  6. #pop(i)删除指定位置的元素
  7. list3 = ['a','b','c','d']
  8. list3.pop(1)
  9. print(list3)
  10. ['a', 'c', 'd']

remove方法

  1. list3 = ['a','b','c','d']
  2. list3.remove('b')
  3. print(list3)
  4. ['a', 'c', 'd']

del方法

  1. list3 = ['a','b','c','d']
  2. del list3[0]
  3. print(list3)
  4. ['b', 'c', 'd']
  5. #整个删除
  6. del list3

  1. list1 = ['Google','Huawei',1997,2000]
  2. list1[1] = 'Apple'
  3. print(list1)
  4. ['Google', 'Apple', 1997, 2000]
  5. list1 = ['Google','Huawei',1997,2000]
  6. list1[1:2] = ['Apple',2333]
  7. print(list1)
  8. ['Google', 'Apple', 2333, 1997, 2000]

其他操作

列表还有一些其他操作,如 + 和 ,操作和字符串相似,+组合,重复
示例:

  1. >>> [1,2,3]+[4,5,6]
  2. [1, 2, 3, 4, 5, 6]
  3. >>> ['oh! ']*10
  4. ['oh! ', 'oh! ', 'oh! ', 'oh! ', 'oh! ', 'oh! ', 'oh! ', 'oh! ', 'oh! ', 'oh! ']
  5. >>> 2 in [1,2,3]
  6. True
  7. >>> max([1,2,3])
  8. 3
  9. >>> min([3,2,1])
  10. 1

list.的一些方法

名称 功能
list.append(obj) 在列表末尾添加新对象
list.count(obj) 统计某个元素在列表中出现的次数
list.extend(obj) 在列表的末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj) 从列表中找出某个值第一个匹配的索引位置
list.insert(index,obj) 将对象插入列表
list.pop(obj=list[-1]) 移除列表中的一个元素(默认最后一个),并返回该元素的值
list.remove(obj) 移除列表中某个值的第一个匹配项
list.reverse() 反向列表中的元素
list.sort([func]) 对原列表排序
list.clear() 清空列表
list.copy() 复制列表


例子:

  1. #排序后反向存放
  2. list1=[3,2,1,5,4,6]
  3. list1.sort(reverse=True)
  4. print(list1)
  5. [6, 5, 4, 3, 2, 1]

元组(tuple)

tuple
元组和列表类似,用()括起来,”,”分隔的序列。不同列表的是,元组是只读的,无法修改,在定义的时候元素必须被确定下来,也可以像列表一样,用索引访问
所以元组可以理解为只读的列表

元组的应用

  1. >>> t = ('Google','Huawei',1997,2000)
  2. >>> t[0]
  3. 'Google'
  4. >>> t[-1]
  5. 2000
  6. #修改元组的值会抛出异
  7. >>> t[0] = 'baidu'
  8. Traceback (most recent call last):
  9. File "<pyshell#60>", line 1, in <module>
  10. t[0] = 'baidu'
  11. TypeError: 'tuple' object does not support item assignment
  12. #定义一个空元组
  13. >>> t = ()
  14. >>> t
  15. ()
  16. >>> type(t)
  17. <class 'tuple'>
  18. #当元组只有一个元素时,元素后面带上逗号,","是元组的特征
  19. >>> t = (1)
  20. >>> type(t)
  21. <class 'int'>
  22. >>>
  23. >>> t = (1,)
  24. >>> type(t)
  25. <class 'tuple'>

元组中含列表

注意,元组的元素不变是指每个元素的指向永远不变,如果元组的某个元素是一个列表,那么这个列表的元素是可以改变的,但元组指向这个列表永远不变。
例子:元组的元素是列表

  1. >>> a=['a','b'] #定义一个列表a
  2. >>> b=['c','d'] #定义一个列表b
  3. >>> t=('e','f',a) #定义一个元组t,第三个元素指向列表a
  4. >>> t
  5. ('e', 'f', ['a', 'b'])
  6. #t[2]相当于a,t[2][0]相当于a[0]
  7. >>> t[2][0]
  8. 'a'
  9. >>> t[2][1]
  10. 'b'
  11. #相当于修改a[0]=x
  12. >>> t[2][0]='x'
  13. >>> t[2][1]='y'
  14. >>> a
  15. ['x', 'y']
  16. >>> t
  17. ['e', 'f', ['x', 'y']]
  18. #在元组中t[2]指向的是a,之这个指向无法更改
  19. >>> t[2]=b
  20. Traceback (most recent call last):
  21. File "<pyshell#178>", line 1, in <module>
  22. t[2]=b
  23. TypeError: 'tuple' object does not support item assignment

如果希望元组中的每个元素无法修改,就必须保证元组中的内一个元素本身也不能改变,如数字、字符串、元组等不可变数据类型。

  • 元组不允许被被修改,但能进行连接组合
  • 元组中的元素不允许删除,但可以用del删除整个元组

字典(dict)

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
字典是Python中唯一的映射类型,采用键值对(key-value)的形式存储数据。
“映射”是数学中的术语,简单理解,它指的是元素之间相互对应的关系,即通过一个元素,可以唯一找到另一个元素。

Python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。
可哈希表示key必须是不可变类型,如:数字、字符串、元组。
字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

定义

字典的定义非常简单:使用一堆花括号{}括起,键值对之间使用”,”分隔,例如

  1. >>> dict = {'hello':'你好','world':'世界'} #定义字典
  2. >>> dict
  3. {'hello': '你好', 'world': '世界'}
  4. >>> len(dict) #计算字典元素个数,即键的总数
  5. 2
  6. >>> str(dict) #输出字典。可以打印的字符串表示
  7. "{'hello': '你好', 'world': '世界'}"

字典值可以是任何python对象,既可以是标准对象,也可以是用户自定义对象,但键不行,有两点要注意:
(1)不允许同一个键出现两次

  1. >>> dict = {'hello':'你好','world':'世界','hello':'hello'} #hello的键值被更新了
  2. >>> str(dict)
  3. "{'hello': 'hello', 'world': '世界'}"

(2)因为键值不可变,所以可以用数字、字符串或元组充当,用列表则不行,即键必须为不可变数据类型

  1. #键是列表,会报错
  2. >>> dict = {'a':1,'b':2,['a']:'abc'}
  3. Traceback (most recent call last):
  4. File "<pyshell#216>", line 1, in <module>
  5. dict = {'a':1,'b':2,['a']:'abc'}
  6. TypeError: unhashable type: 'list'

遍历字典

  1. >>> d = { 'a':1,'b':2,'c':3,'d':4,'e':5,'f':6 } #定义一个字典
  2. >>> for key,value in d.items(): #d.items()方法返回一个可遍历的键值对的元组
  3. print(key,value)
  4. a 1
  5. b 2
  6. c 3
  7. d 4
  8. e 5
  9. f 6
  10. >>> for key in d:
  11. print(key,d[key])
  12. a 1
  13. b 2
  14. c 3
  15. d 4
  16. e 5
  17. f 6

字典的常用方法

名称 功能
radiansdict.clear() 删除字典所有元素
radiansdict.copy() 返回字典的一个浅复制(只是将指定对象中的所有引用复制了一份)
radiansdict.fromkeys(seq[,value]) 返回一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
radiansdict.get(key,default=None) 返回指定键的值,如果不存在测返回default的值
key in dict 如果键在dict中,则返回true,否则返回false
radiansdict.items() 以列表返回可遍历的元组
radiansdict.keys() 以列表返回一个字典的所有的键
radiansdict.setdefault(key,default=None) 与get()类似,但如果键不存在于字典中,则会添加键并将值设置为default
radiansdict.update(dict2) 把字典dict2的键/值对更新到dict中
radiansdict.values() 以列表返回字典中的所有值
radiansdict.pop(key[,default]) 删除字典给定键key所对应的值,返回值为被删除的值。key值必须给出。否则返回default值
radiansdict.popitem() 随机返回并删除字典中的一对键值(一般是删除末尾)


集合(set)

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。也无法存储列表、字典、集合这些可变的数据类型
集合是一个无序的,不重复的数据组合,它的主要作用如下:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系

可以用”x in set”来判断x是否在集合中,使用”len(set)”来获取集合元素个数,使用”for x in set”来遍历集合中的元素。集合不记录位置元素,所以也不能获取元素位置和切片等操作。

对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

定义和常见用法

  1. >>> x=set('abcd') #创建集合x由单个字符组成
  2. >>> y=set(['a','bc','d',10]) #创建集合y有列表元素组成
  3. >>> x,y #打印x,y
  4. ({'a', 'b', 'd', 'c'}, {'a', 10, 'bc', 'd'})
  5. >>> x&y #取交集
  6. {'a', 'd'}
  7. >>> x|y #取并集
  8. {'bc', 'a', 'd', 10, 'b', 'c'}
  9. >>> x-y #取差集(x有,y没有的)
  10. {'b', 'c'}
  11. >>> x^y #对称差集(在x中有或在y中有,不会同时出现在二者中)
  12. {'bc', 10, 'b', 'c'}

使用集合去重

  1. >>> a = [11,22,33,44,11,22]
  2. >>> b = set(a)
  3. >>> b
  4. {33, 11, 44, 22}

集合的基本操作

集合 操作
s.add(‘x’) 添加一项
s.update([10.20.30]) 在s中添加多项
s,remove([‘H’]) 使用remove()删除一项
len(s) set的长度
x in s 测试x是否是s的成员
s not in s 测试x是否不是s的成员
s.issubset(t) 相当于s<=t测试是否s中每一个元素都在t中
s.issuperset(t) 相当于s>=t测试是否t中每一个元素都在s中
s.union(t) 相当于s|t返回一个新的set包含s和t中的每一个元素
s.intersection(t) 相当于s&t返回一个新的set包含s和t中的公共元素
s.difference(t) 相当于s-t返回一个新的set包含s中有是t中没有的元素
s.symmetric_difference(t) 相当于s^t返回一个新的set,包含s和t中不重复的元素
s.copy() 返回集合s的一个浅复制
s.discard(x) 如果在set”s”中存在元素x,则删除
s.pop() 删除且返回set”s”中的一个不确定元素,如果为空则引发KeyError
s.clear() 删除set”s”中的所有元素

union()、intersection()、difference()、symmetric_difference()的非运算符(non-operator就是形如s.union这样的)版本将会接受任何可迭代对象(iterable)作为参数。相反,它们的运算符版本(&^+-|)要求参数必须是集合对象