1. 列表(list)
1.1 列表的简介
数组是python中常见的数据结构之一,列表中的每一个元素都被分配一个数字作为索引,用来表示该元素在列表中的位置。从0开始,第一个是0,第二个是1,以此类推
python中的列表是一个有序的,可重复的元素集合,嵌套、迭代、修改、分片、追加、删除,成员判断。
从数据结构的角度来看,python的列表是一个可变长的顺序存储结构,每个位置存储的都是对象的指针
1.2 列表的创建
用list()
函数或[]
将元素包围,元素之间用逗号分隔
>>> a = [1, 2, {3, 4, 5}, [6, 7]]
>>> print(type(a))
<class 'list'>
>>> b = list((2, 4, 6, 8, 10))
>>> print(type(b))
<class 'list'>
1.3 列表的访问
访问列表中的元素通过下标索引的形式进行访问。以方括号加下标值来访问元素。但在访问时要注意,下标值的大小不能大于列表长度-1,列表下标是从0开始到列表长度-1的。一旦下标越界,代码就会抛出异常。获取列表长度的方法:len(列表变量名)
>>> a = [1,2,3,4,5,6]
>>> a[1]
2
>>> a[7]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> len(a)
6
# 在使用下标访问列表元素的时候 负数下标相当于从后往前数,从-1开始
>>> a[-1]
6
1.4 修改元素值
直接对元素进行重新赋值
>>> a[1]
2
>>> a[1] = 'a'
>>> a[1]
'a'
1.5 删除元素
删除元素的方法有三个:del
、remove()
和pop()
-
del python中的删除关键字,可以用来删除变量
-
list.remove(obj):移除列表中某个值的第一个匹配项,但如果被移除的元素不存在,会报错
-
list.pop(): 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
>>> a [1, 'a', 3, 4, 5, 6] >>> del a[0] >>> a ['a', 3, 4, 5, 6] >>> a.remove('c') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: list.remove(x): x not in list >>> a.remove(3) >>> a ['a', 4, 5, 6] >>> a.pop() 6 >>> a ['a', 4, 5]
1.6 列表的遍历
>>> a = [1,2,3]
>>> for i in a:
... print(i)
...
1
2
3
>>> for i in range(len(a)):
... print(a[i])
...
1
2
3
1.7 列表的切片
>>> a = [1,2,3,4,5,6]
>>> a[1:5]
[2, 3, 4, 5]
使用[start_index : end_index]
来实现列表的切片,是一个左闭右开的区间范围
2. 元组(Tuple)
元组,也是一种序列结构,又名定值表,用于存储值固定不变的值表。
2.1 元组的创建
列表使用[]
创建,元组的创建使用()
创建元组注意点:
-
元组允许空创建
>>> a = () >>> type(a) <class 'tuple'>
-
创建元组时如果只有一个数据时,要在数据后面加
,
不然创建的就不是一个元组对象>>> b = ('123') >>> type(b) <class 'str'> >>> c = (123) >>> type(c) <class 'int'> >>> d = (123,) >>> type(d) <class 'tuple'>
2.2 元组的操作
元组除了内部元素不可更改外,其他方面和列表大致相同
-
元组与列表相同的操作:
-
使用方括号加下标访问元素
-
切片(形成新元组对象)
-
count()/index()
-
len()/max()/min()/tuple()
-
-
元组中不允许的操作,确切的说是元组没有的功能:
-
修改、新增元素
-
删除某个元素(但可以删除整个元组)
-
所有会对元组内部元素发生修改动作的方法。例如,元组没有remove,append,pop等方法。
-
注:元组只保证一级子元素不可变,不保证嵌套的内部元素不可变
>>> a = (1,'a',['A','D'])
>>> a
(1, 'a', ['A', 'D'])
>>> a[1]
'a'
>>> a[1] = 'A' # 元组保证一级子元素不变
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> a[2]
['A', 'D']
>>> a[2] = 'A' # 元组保证一级子元素不变
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> a[2][1] = 'C'
>>> a[2]
['A', 'C']
3. 字典(dict)
字典数据类型是基于hash散列算法实现的,采用键值对
(key:value)
的形式,根据key
的值去计算value
的地址,具有非常快的查询和写入速度注:在python3.6开始,字典是有序的!它将保持数据插入时的顺序,但是,字典元素在内存中是不连续的,也没有链接关系
字典可描述为一个不定长、可变、散列的集合类型。
3.1 字典的创建
创建字典使用{}
或者dict()
函数,创建时每个键值对用 :
分隔,两个键值对之间用 ,
分隔,整个字典包含在{}
中
>>> dic = {1:"java",2:"python"}
>>> type(dic)
<class 'dict'>
>>> dic
{1: 'java', 2: 'python'}
注:在创建字典时值可以说任意的数据类型,但键必须是不可变的对象,例如整数、字符串bytes和元组
>>> dict([(1,"python"),(2,"java")]) # dict()创建字典
{1: 'python', 2: 'java'}
>>> dict([([1],"python"),(2,"java")]) # 列表不能作为键
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> dict([((1,),"python"),(2,"java")]) # 元组可以作为键
{(1,): 'python', 2: 'java'}
3.2 字典的访问
虽然字典在访问时是有序的,但是其仍然是一个集合,并不具备下标访问的功能,当然也没有切片的说法。不过字典可以通过把键放入方括号的形式来取值
>>> dic = {"name":"python","age":31}
>>> dic['name']
'python'
如果值不存在,就会报错:
>>> dic['names']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'names'
3.3 增加和修改
向字典中添加元素和修改字典中的元素的方法就是一样的变量名[key] = value
>>> dic['author'] = '龟叔'
>>> dic
{'name': 'python', 'age': 31, 'author': '龟叔'}
>>> dic['author'] = 'Guido van Rossum'
>>> dic
{'name': 'python', 'age': 31, 'author': 'Guido van Rossum'}
3.4 字典的删除
-
字典元素的删除
>>> dic {'name': 'python', 'age': 31, 'author': 'Guido van Rossum'} >>> del dic['name'] >>> dic {'age': 31, 'author': 'Guido van Rossum'}
-
清空字典
>>> dic.pop(age) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'age' is not defined >>> dic.pop('age') 31 >>> dic.clear() >>> dic {}
-
删除字典
>>> del dic >>> dic Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'dic' is not defined
4. 字节串(bytes)
bytes是Python3中新出现的数据类型,bytes类型也是用来表达一个字符串的,不过他是以字节为单位处理字符串,字符串是以字符为单位处理字符串
字节串(bytes)和字符串(string)的对比:
- 字符串由若干个字符组成,以字符为单位进行操作;字节串由若干个字节组成,以字节为单位进行操作。
- 字节串和字符串除了操作的数据单元不同之外,它们支持的所有方法都基本相同。
- 字节串和字符串都是不可变序列,不能随意增加和删除数据。
4.1 字节串的创建
字节串的创建方法有两种:
b' '
和bytes(字符串, encoding='编码类型')
>>> b = b'bytes'
>>> b
b'bytes'
>>> type(b)
<class 'bytes'>
>>> c = bytes('bytes') # 一定要指定编码
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
>>> c = bytes('bytes', encoding='utf8')
>>> type(c)
<class 'bytes'>
4.2 字节串和字符串的转换
str.encode('编码类型')
:利用字符串的encode方法编码成bytes,默认为utf-8类型
bytes.decode('编码类型')
:将bytes对象解码成字符串,默认使用utf-8进行解码。
>>> str = '人生苦短,我用python'
>>> str.encode()
b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python'
>>> str
'人生苦短,我用python'
>>> b = str.encode()
>>> b
b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8python'
>>> b.decode()
'人生苦短,我用python'
5. 集合(set)
…