[Python-2]Python序列

目录

一、列表

1. 列表简介

2. 列表的创建

(1)基本语法创建

(2)list()创建

(3)range()创建整数列表

(4)推导式生成列表

3. 列表元素的增加

(1)append()方法

(2)extend()方法

 (3)insert()插入元素

(4)+运算符操作

(5)乘法扩展

4. 列表元素的删除

(1)del 删除

(2)pop()方法

(3)remove()方法

5. 列表元素访问和计数

(1)通过索引直接访问元素

 (2)index()获得指定元素在列表中首次出现的索引

(3)count()获得指定元素在列表中出现的次数

(4)len()返回列表长度

(5)成员资格判断

6. 切片操作

7. 列表的遍历

8. 复制列表所有的元素到新列表对象

9. 列表排序

(1)修改原列表,不建新列表的排序 

(2)建新列表的排序

(3)reversed()返回迭代器

10. 列表相关的其他内置函数汇总

(1) max和min

(2)sum

11. 多维列表——二维列表 

二、元组tuple

1. 元组的创建

(1) 通过()创建元组。

(2) 通过tuple()创建元组

2. 元组的元素访问和计数 

3. zip 

 4. 生成器推导式创建元组

三、字典

1. 字典的创建 

(1)通过{}、dict()来创建字典对象。 

(2)通过zip()创建字典对象

(3)通过fromkeys创建值为空的字典

2. 字典元素的访问

(1)通过 [键] 获得“值”。若键不存在,则抛出异常。 

(2)通过get()方法获得“值”。

 (3)列出所有的键值对

(4)列出所有的键,列出所有的值

(5)len() 键值对的个数

(6)检测一个“键”是否在字典中

3. 字典元素添加、修改、删除

(1) 给字典新增“键值对”。

(2)使用update()将新字典中所有键值对全部添加到旧字典对象上。

(3)字典中元素的删除。

(4)popitem() :随机删除和返回该键值对。

4. 序列解包

5. 表格数据使用字典和列表存储和访问

 6. 字典核心底层原理

7. 根据键查找“键值对”的底层过程 

四、集合 

1. 集合创建和删除 

(1)使用{}创建集合对象,并使用add()方法添加元素

(2)使用set(),将列表、元组等可迭代对象转成集合。如果原来数据存在重复数据,则只保留一个

(3)remove()删除指定元素;clear()清空整个集合

2. 集合相关操作


序列:列表、元组、字典、集合、字符串 

序列的本质和内存结构:序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列就是一块用来存放多个值的连续的内存空间。

由于Python3中一切皆对象,在内存中实际是按照如下方式存储的:

 从图示中,我们可以看出序列中存储的是整数对象的地址,而不是整数对象的值。

一、列表

1. 列表简介

  • 列表:用于存储任意数目任意类型的数据集合。

  • 列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表的标准语法格式:a = [10,20,30,40]

  • 列表中的元素可以各不相同,可以是任意类型。比如:a = [10,20,'abc',True]

  • Python的列表大小可变,根据需要随时增加或缩小。

方法 要点 描述
list.append(x) 增加元素 将元素x增加到列表list尾部
list.extend(aList) 增加元素 将列表alist所有元素加到列表list尾部
list.insert(index,x) 增加元素 在列表list指定位置index处插入元素x
list.remove(x) 删除元素 在列表list中删除首次出现的指定元素x
list.pop([index]) 删除元素 删除并返回列表list指定为止index处的元素,默认是最后一个元素
list.clear() 删除所有元素 删除列表所有元素,并不是删除列表对象
list.index(x) 访问元素 返回第一个x的索引位置,若不存在x元素抛出异常
list.count(x) 计数 返回指定元素x在列表list中出现的次数
len(list) 列表长度 返回列表中包含元素的个数
list.reverse() 翻转列表 所有元素原地翻转
list.sort() 排序 所有元素原地排序
list.copy() 浅拷贝 返回列表对象的浅拷贝

2. 列表的创建

(1)基本语法创建

a = [10,20,'pigpig','handsome']
b = [] #创建一个空的列表对象
print(a)

(2)list()创建

使用list()可以将任何可迭代的数据转化成列表。

a = list() #创建一个空的列表对象
b = list(range(10)) #结果:[0,1,2,3,4,5,6,7,8,9]
c = list("pig, me") #结果:['p','i','g','m','e']

(3)range()创建整数列表

range([start,] end [,step])

  • start参数:可选,表示起始数字。默认是0

  • end参数: 必选,表示结尾数字。

  • step参数:可选,表示步长,默认为1

python3中range()返回的是一个range对象,而不是列表。我们需要通过list()方法将其转换成列表对象。 

a = list(range(3,15,2)) #结果:[3, 5, 7, 9, 11, 13]
b = list(range(15,9,-1)) #结果:[15, 14, 13, 12, 11, 10]
c = list(range(3,-4,-1)) #结果:[3, 2, 1, 0, -1, -2, -3]
print(a,b,c)

(4)推导式生成列表

#循环创建多个元素 [0, 2, 4, 6, 8]
a = [x*2  for  x  in range(5)]

#通过if过滤元素[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
b = [x*2 for x in range(100) if x%9==0]

print(a,b)

3. 列表元素的增加

不生成新列表:append() expend() insert()  生成新列表:+尾部添加 乘法扩展

(1)append()方法

原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。 

a = [20,40]
a.append(80)
print(a)       #结果:[20, 40, 80]

(2)extend()方法

将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。()

a = [20,40]
print(id(a))
b = [50,60]
a.extend(b)     #原对象修改
print(id(a))
a = a+b         #产生新对象
print(id(a))

 (3)insert()插入元素

        使用insert()方法可以将指定的元素插入到列表对象的任意制定位置。这样会让插入位置后面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。

        类似发生这种移动的函数还有:remove()pop()del(),它们在删除非尾部元素时也会发生操作位置后面元素的移动。

a = [10,20,30]
a.insert(2,100)
print(a)    #结果:[10, 20, 100, 30]

(4)+运算符操作

        并不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次复制到新的列表对象中。这样,会涉及大量的复制操作,对于操作大量元素不建议使用

a = [20,40]
print(id(a))
a = a+[50]
print(id(a))  #两次地址不一样,创建了新的对象

(5)乘法扩展

        使用乘法扩展列表,生成一个新列表,新列表元素是原列表元素的多次重复

a = ['sxt',100]
b = a*3
print(a) #结果:['sxt', 100]
print(b) #结果:['sxt', 100, 'sxt', 100, 'sxt', 100]

适用于乘法操作的,还有:字符串、元组。 

4. 列表元素的删除

删除元素的本质是:元素的拷贝

(1)del 删除

删除列表指定位置的元素。

a = [100,200,888,300,400]
del a[2]
print(a)    #结果:[100,200,300,400]

(2)pop()方法

pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。

a = [10,20,30,40,50]
b1 = a.pop()    #结果:b1=50
print(a,b1)  #结果:[10, 20, 30, 40]  50
b2 = a.pop(1)
print(a,b2)  #结果:[10, 30, 40],20

(3)remove()方法

删除首次出现的指定元素,若不存在该元素抛出异常。

a = [10,20,30,40,50,20,30,20,30]
a.remove(20)   #[10, 30, 40, 50, 20, 30, 20, 30]
a.remove(100)  #报错:ValueError:list.remove(x): x not in list

5. 列表元素访问和计数

(1)通过索引直接访问元素

        我们可以通过索引直接访问元素。索引的区间在[0, 列表长度-1]这个范围。超过这个范围则会抛出异常

a = [10,20,30,40,50,20,30,20,30]
print(a[2])  #结果:30
print(a[10]) #报错:IndexError: list index out of range

 (2)index()获得指定元素在列表中首次出现的索引

   index()可以获取指定元素首次出现的索引位置。语法是:index(value,[start,[end]])。其中,startend指定了搜索的范围。

>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.index(20)   #结果:1
>>> a.index(20,3)  #结果:5    从索引位置3开始往后搜索的第一个20
>>> a.index(30,5,7)  #结果:6  从索引位置5到7这个区间,第一次出现30元素的位置

(3)count()获得指定元素在列表中出现的次数

        count()可以返回指定元素在列表中出现的次数。

>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.count(20)
3

(4)len()返回列表长度

        len()返回列表长度,即列表中包含元素的个数

>>> a = [10,20,30]
>>> len(a)
3

(5)成员资格判断

        判断列表中是否存在指定的元素,我们可以使用count()方法,返回0则表示不存在,返回大于0则表示存在。但是,一般我们会使用更加简洁的in关键字来判断,直接返回TrueFalse

 >>> a = [10,20,30,40,50,20,30,20,30]
 >>> 20 in a
 True
 >>> 100 not in a
 True
 >>> 30 not in a
 False

6. 切片操作

类似字符串的切片操作,对于列表的切片操作和字符串类似。

        切片是Python序列及其重要的操作,适用于列表、元组、字符串等等。

        切片slice操作可以让我们快速提取子列表或修改。标准格式为:

[起始偏移量start:终止偏移量end[:步长step]]

典型操作(三个量为正数的情况)如下:

操作和说明 示例 结果
[:] 提取整个列表 [10,20,30][:] [10,20,30]
[start:]从start索引开始到结尾 [10,20,30][1:] [20,30]
[:end]从头开始知道end-1 [10,20,30][:2] [10,20]
[start:end]从start到end-1 [10,20,30,40][1:3] [20,30]
[start:end:step]从start提取到end-1,步长是step [10,20,30,40,50,60,70][1:6:2] [20, 40, 60]

其他操作(三个量为负数)的情况: 

示例 说明 结果
[10,20,30,40,50,60,70][-3:] 倒数三个 [50,60,70]
[10,20,30,40,50,60,70][-5:-3] 倒数第五个到倒数第三个(包头不包尾) [30,40]
[10,20,30,40,50,60,70][::-1] 步长为负,从右到左反向提取 [70, 60, 50, 40, 30, 20, 10]

        切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成”长度-1”。例如:

[10,20,30,40][1:30]  结果:[20, 30, 40]

7. 列表的遍历

a = [10,20,30,40]
for obj in a:       #obj是临时变量名称,随意起
    print(obj)

8. 复制列表所有的元素到新列表对象

list1 = [30,40,50]
list2 = list1

只是将list2也指向了列表对象,也就是说list2和list2持有地址值是相同的,列表对象本身的元素并没有复制。

        我们可以通过如下简单方式,实现列表元素内容的复制: 

list1 = [30,40,50]
list2 = [] + list1  #生成了新列表对象

注:我们后面也会学习copy模块,使用浅复制或深复制实现我们的复制操作。

9. 列表排序

(1)修改原列表,不建新列表的排序 

>>> a = [20,10,30,40]
>>> id(a)
46017416
>>> a.sort()         #默认是升序排列
>>> a
[10, 20, 30, 40]
>>> a = [10,20,30,40]
>>> a.sort(reverse=True)    #降序排列
>>> a
[40, 30, 20, 10]
>>> import random
>>> random.shuffle(a)    #打乱顺序
>>> a
[20, 40, 30, 10]

(2)建新列表的排序

        我们也可以通过内置函数sorted()进行排序,这个方法返回新列表,不对原列表做修改

>>> a = [20,10,30,40]
>>> id(a)
46016008
>>> b = sorted(a)          #默认升序
>>> b
[10, 20, 30, 40]
>>> id(b)
45907848
>>> c = sorted(a,reverse=True)    #降序
>>> c
[40, 30, 20, 10]

        通过上面操作,我们可以看出,生成的列表对象b和c都是完全新的列表对象。

(3)reversed()返回迭代器

        内置函数reversed()也支持进行逆序排列,与列表对象reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象

>>> a = [20,10,30,40]
>>> c = reversed(a)
>>> c
<list_reverseiterator object at 0x0000000002BCCEB8>
>>> list(c)
[40, 30, 10, 20]
>>> list(c)
[]

 我们打印输出c发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用list(c)进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用

10. 列表相关的其他内置函数汇总

(1) max和min

        用于返回列表中最大和最小值。

>>> a = [3,10,20,15,9]
>>> max(a)
20
>>> min(a)
3

(2)sum

        对数值型列表的所有元素进行求和操作,对非数值型列表运算则会报错。

>>> a = [3,10,20,15,9]
>>> sum(a)
57

11. 多维列表——二维列表 

  • 一维列表可以帮助我们存储一维、线性的数据。
  • 二维列表可以帮助我们存储二维、表格的数据。例如下表的数据:
    姓名 年龄 薪资 城市
    高小一 18 30000 北京
    高小二 19 20000 上海
    高小五 20 10000 深圳
a = [
        ["高小一",18,30000,"北京"],
        ["高小二",19,20000,"上海"],
        ["高小五",20,10000,"深圳"],
    ]

>>> print(a[1][0],a[1][1],a[1][2])
高小二 19 20000
a = [
        ["高小一",18,30000,"北京"],
        ["高小二",19,20000,"上海"],
        ["高小一",20,10000,"深圳"],
    ]
for m in range(3):
    for n in range(4):
        print(a[m][n],end="\t")
    print() #打印完一行,换行

二、元组tuple

  • 列表属于可变序列,可以任意修改列表中的元素。

  • 元组属于不可变序列,不能修改元组中的元素。

  • 因此,元组没有增加元素、修改元素、删除元素相关的方法

1. 元组的创建

(1) 通过()创建元组。

        小括号可以省略。 a = (10,20,30) 或者 a = 10,20,30

        如果元组只有一个元素,则必须后面加逗号。这是因为解释器会把(1)解释为整数1,(1,)解释为元组。a = 10,

>>> a = (1)
>>> type(a)
<class 'int'>
>>> a = (1,)     #或者  a = 1, 
>>> type(a)
<class 'tuple'>

(2) 通过tuple()创建元组

        tuple(可迭代的对象)

a = tuple()     #创建一个空元组对象
b = tuple("abc")
c = tuple(range(3))
d = tuple([2,3,4])

总结: 

  • tuple()可以接收列表、字符串、其他序列类型、迭代器等生成元组。
  • list()可以接收元组、字符串、其他序列类型、迭代器等生成列表。

2. 元组的元素访问和计数 

  • 元组的元素不能修改
    >>> a = (20,10,30,9,8)
    >>> a[3]=33
    Traceback (most recent call last):
      File "", line 1, in <module>
        a[3]=33
    TypeError: 'tuple' object does not support item assignment
  • 元组的元素访问、index()、count()、切片等操作,和列表一样。 
    >>> a = (20,10,30,9,8)
    >>> a[1]
    10
    >>> a[1:3]
    (10, 30)
    >>> a[:4]
    (20, 10, 30, 9)
  • 列表关于排序的方法list.sorted()修改原列表对象,元组没有该方法。如果要对元组排序,只能使用内置函数sorted(tupleObj),并生成新的列表对象。 
    a = (20,10,30,9,8)
    b = sorted(a)   #b是新对象,内容是:[8, 9, 10, 20, 30]

3. zip 

        zip(列表1,列表2,...)将多个列表对应位置的元素组合成为元组,并返回这个zip对象。 

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同 

a = [10,20,30]
b = [40,50,60]
c = [70,80,90,100]
d = zip(a,b,c)
print(d)   #zip object
e = list(d) #列表:[(10, 40, 70), (20, 50, 80), (30, 60, 90)]
print(e)

 4. 生成器推导式创建元组

  • 从形式上看,生成器推导式与列表推导式类似,只是生成器推导式使用小括号
  • 列表推导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象
  • 我们可以通过生成器对象,转化成列表或者元组。也可以使用生成器对象的__next__()方法进行遍历或者直接作为迭代器对象来使用。不管什么方式使用,元素访问结束后,如果需要重新访问其中的元素,必须重新创建该生成器对象
#列表推导式: [0, 2, 4, 6, 8]
#a = [x*2  for  x  in range(5)]
#print(a)
​
s = (x*2 for x in range(5))
print(s)   # at 0x0000021C80BE2880>
b = tuple(s)
print(b)    #(0, 2, 4, 6, 8)
c = tuple(s)
print(c)    #()
​
s2 = (x for x in range(3))
print(s2.__next__())        #0
print(s2.__next__())        #1
print(s2.__next__())        #2
print(s2.__next__())        #报错:StopIteration

 组总结:

  • 元组的核心特点是:不可变序列
  • 元组的访问和处理速度比列表快
  • 与整数和字符串一样,元组可以作为字典的键,列表则永远不能作为字典的键使用

三、字典

        字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。 

  • “键”是任意的不可变数据,比如:整数、浮点数、字符串、元组
  • 但是:列表、字典、集合这些可变对象,不能作为“键”
  • 并且“键”不可重复。
  • “值”可以是任意的数据,并且可重复

1. 字典的创建 

(1)通过{}、dict()来创建字典对象。 

a = {'name':'pig','age':18,'job':'programmer'}
b = dict(name='pig',age=18,job='programmer')
a = dict([("name","pig"),("age",18)])
c = {}  #空的字典对象
d = dict()  #空的字典对象

(2)通过zip()创建字典对象

k = ['name','age','job']
v = ['pig',18,'teacher']
d = dict(zip(k,v))
print(d) #{'name': 'pig', 'age': 18, 'job': 'techer'}

(3)通过fromkeys创建值为空的字典

f = dict.fromkeys(['name','age','job'])
print(f)  #结果:{'name': None, 'age': None, 'job': None}

2. 字典元素的访问

我们这里设定一个字典对象:a = {'name':'dog','age':18,'job':'programmer'}

(1)通过 [键] 获得“值”。若键不存在,则抛出异常。 

a = {'name':'dog','age':18,'job':'programmer'}
b = a['name']
print(b)

(2)通过get()方法获得“值”。

推荐使用。

优点是:指定键不存在,返回None;也可以设定指定键不存在时默认返回的对象。

推荐使用get()获取“值对象”

a = {'name':'dog','age':18,'job':'programmer'}
b = a.get('name')
c = a.get('gender','不存在')
print(b)
print(c)

 (3)列出所有的键值对

a = {'name':'dog','age':18,'job':'programmer'}
b = a.items()
print(b)  #dict_items([('name', 'dog'), ('age', 18), ('job', 'programmer')])

(4)列出所有的键,列出所有的值

a = {'name':'dog','age':18,'job':'programmer'}
k = a.keys()
v = a.values()
print(k)  #dict_keys(['name', 'age', 'job'])
print(v)  #dict_values(['dog', 18, 'programmer'])

(5)len() 键值对的个数

a = {'name':'dog','age':18,'job':'programmer'}
num = len(a)
print(num)  #3

(6)检测一个“键”是否在字典中

a = {'name':'dog','age':18,'job':'programmer'}
print("name" in a)  #True

3. 字典元素添加、修改、删除

(1) 给字典新增“键值对”。

如果“键”已经存在,则覆盖旧的键值对;如果“键”不存在,则新增“键值对”

a = {'name':'me','age':18,'job':'programmer'}
a['address']='China'
a['age']=16
print(a) 
#{'name': 'me', 'age': 16, 'job': 'programmer', 'address': 'China'}

(2)使用update()将新字典中所有键值对全部添加到旧字典对象上。

如果key有重复,则直接覆盖

a = {'name':'me','age':18,'job':'programmer'}
b = {'name':'you','money':1000,'gender':'men'}
a.update(b)
print(a)
#{'name': 'you', 'age': 18, 'job': 'programmer', 'money': 1000, 'gender': 'men'}

(3)字典中元素的删除。

可以使用del()方法;或者clear()删除所有键值对;pop()删除指定键值对,并返回对应的“值对象”

a = {'name':'me','age':18,'job':'programmer'}
del(a['name'])
print(a)       #{'age': 18, 'job': 'programmer'}
age = a.pop('age')
print(age)     #18

(4)popitem() :随机删除和返回该键值对。

字典是“无序可变序列”,因此没有第一个元素、最后一个元素的概念;popitem弹出随机的项,因为字典并没有"最后的元素"或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效(因为不用首先获取键的列表)

a = {'name':'me','age':18,'job':'programmer'}
r1 = a.popitem()
r2 = a.popitem()
r3 = a.popitem()
print(a)    #{}

4. 序列解包

序列解包可以用于元组、列表、字典。序列解包可以让我们方便的对多个变量赋值。 

x,y,z=(20,30,10)
(a,b,c)=(9,8,10)
[m,n,p]=[10,20,30]

        序列解包用于字典时,默认是对“键”进行操作如果需要对键值对操作,则需要使用items();如果需要对“值”进行操作,则需要使用values();

s = {'name':'me','age':18,'job':'teacher'}
a,b,c=s          #默认对键进行操作
print(a)    #name
name,age,job=s.items()      #对键值对进行操作
print(b)    #('name', 'me')
name,age,job=s.values()     #对值进行操作
print(c)    #me

5. 表格数据使用字典和列表存储和访问

姓名 年龄 薪资 城市
高小一 18 30000 北京
高小二 19 20000 上海
高小五 20 10000 深圳
r1 = {"name":"高小一","age":18,"salary":30000,"city":"北京"}
r2 = {"name":"高小二","age":19,"salary":20000,"city":"上海"}
r3 = {"name":"高小五","age":20,"salary":10000,"city":"深圳"}
​
tb = [r1,r2,r3]
​
#获得第二行的人的薪资
print(tb[1].get("salary"))
​
#打印表中所有的的薪资
for i in range(len(tb)):   # i -->0,1,2
    print(tb[i].get("salary"))

#打印表的所有数据
for i in range(len(tb)):
    print(tb[i].get("name"),tb[i].get("age"),tb[i].get("salary"),tb[i].get("city"))

 6. 字典核心底层原理

        字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket。每个bucket有两部分:一个是键对象的引用,一个是值对象的引用

        由于,所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket

 将一个键值对放进字典的底层过程

a = {}
a["name"]="me"

        假设字典a对象创建完后,数组长度为8:

        我们要把”name”=”me”这个键值对放到字典对象a中,首先第一步需要计算键”name”散列值

        Python中可以通过hash()来计算。

>>> bin(hash("name"))
'-0b1010111101001110110101100100101'

        由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即“101”,十进制是数字5。我们查看偏移量5,对应的bucket是否为空。如果为空,则将键值对放进去。如果不为空,则依次取右边3位作为偏移量,即“100”,十进制是数字4。再查看偏移量为4的bucket是否为空。直到找到为空的bucket将键值对放进去。流程图如下:

扩容

  • python会根据散列表的拥挤程度扩容。“扩容”指的是:创造更大的数组,将原有内容拷贝到新数组中。
  • 接近2/3时,数组就会扩容。

7. 根据键查找“键值对”的底层过程 

>>> a.get("name")
'me'

        当调用a.get(“name”),就是根据键“name”查找到“键值对”从而找到值对象“me”。

        我们仍然要首先计算“name”对象的散列值:

>>> bin(hash("name"))
'-0b1010111101001110110101100100101'

        和存储的底层流程算法一致,也是依次取散列值的不同位置的数字。 假设数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量101,十进制是数字5。我们查看偏移量5,对应的bucket是否为空。如果为空则返回None。如果不为空,和我们的散列值进行比较如果相等。则将对应“值对象”返回。如果不相等,则再依次取其他几位数字,重新计算偏移量。依次取完后,仍然没有找到。则返回None。流程图如下:

用法总结:

  • 字典在内存中开销巨大,典型的空间换时间

  • 键查询速度很快

  • 往字典里面添加新键值对可能导致扩容,导致散列表中键的次序变化。

    因此,不要在遍历字典的同时进行字典的修改
  • 键必须可散列

    1. 数字、字符串、元组,都是可散列的

    2. 自定义对象需要支持下面三点:(面向对象章节中再展开说)

      1. 支持hash()函数
      2. 支持通过__eq__()方法检测相等性
      3. a==b为真,则hash(a)==hash(b)也为真

四、集合 

        集合是无序可变,元素不能重复。实际上,集合底层是字典实现,集合的所有元素都是字典中的“键对象”,因此是不能重复的且唯一的。 

1. 集合创建和删除 

(1)使用{}创建集合对象,并使用add()方法添加元素

a = {3,5,7}
a.add(9)    #{9, 3, 5, 7}

(2)使用set(),将列表、元组等可迭代对象转成集合。如果原来数据存在重复数据,则只保留一个

a = ['a','b','c','b']
b = set(a)  #{'b', 'a', 'c'}

(3)remove()删除指定元素;clear()清空整个集合

a = {10,20,30,40,50}
a.remove(20)   #{10, 50, 40,30}

2. 集合相关操作

>>> a = {1,3,'sxt'}
>>> b = {'he','it','sxt'}
>>> a|b                 #并集
{1, 3, 'sxt', 'he', 'it'}
>>> a&b                 #交集
{'sxt'}
>>> a-b                 #差集
{1, 3}
>>> a.union(b)              #并集
{1, 3, 'sxt', 'he', 'it'}
>>> a.intersection(b)       #交集
{'sxt'}
>>> a.difference(b)         #差集
{1, 3}

猜你喜欢

转载自blog.csdn.net/m0_62735081/article/details/124305624
今日推荐