IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python数据结构 -> 正文阅读

[Python知识库]python数据结构


简单的数据类型:

  • 整型<class ‘int’>
  • 浮点型<class ‘float’>
  • 布尔型<class ‘bool’>

容器数据类型

  • 列表<class ‘list’>
  • 元组<class ‘tuple’>
  • 字典<class ‘dict’>
  • 集合<class ‘set’>
  • 字符串<class ‘str’>

可变类型与不可变类型

  • 序列是以连续的整数为索引,与此不同的是,字典以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。
  • 字典是 Python 唯一的一个 映射类型,字符串、元组、列表属于序列类型。

那么如何快速判断一个数据类型 X 是不是可变类型的呢?两种方法:

  • 麻烦方法:用 id(X) 函数,对 X 进行某种操作,比较操作前后的 id,如果不一样,则 X 不可变,如果一样,则 X 可变。
  • 便捷方法:用 hash(X),只要不报错,证明 X 可被哈希,即不可变,反过来不可被哈希,即可变。
i = 1
print(id(i))  # 140732167000896
i = i + 2
print(id(i))  # 140732167000960

l = [1, 2]
print(id(l))  # 4300825160
l.append('Python')
print(id(l))  # 4300825160
  • 整数 i 在加 1 之后的 id 和之前不一样,因此加完之后的这个 i (虽然名字没变),但不是加之前的那个 i 了,因此整数是不可变类型。

  • 列表 l 在附加 'Python' 之后的 id 和之前一样,因此列表是可变类型。

  • 数值、字符和元组 都能被哈希,因此它们是不可变类型。

  • 列表、集合、字典不能被哈希,因此它是可变类型。

列表 list

定义

  • 列表是有序集合(即存放进去的顺序和输出的顺序一致),没有固定大小,能够保存任意数量、任意类型的python对象,语法为[元素1,元素2,···,元素n]
    • 关键点是[],
    • []把所有元素绑定在一起
    • 将每个元素分开

**底层实现:**线性表

  • 线性表除首尾元素之外,每一个元素都只有一个前驱和一个后继。
  • 其存储结构有顺序表和链表两种。顺序表将表元素直接顺序的放在一块划分的连续存储区内,链表通过指针来实现。
  • 以上的顺序表只适用于存放数据类型相同的数据,而在python中list可以存放不同数据类型的数据。

索引结构:

当元素大小差异巨大,所需的存储单元不一致时,内存没法安排统一的线性结构,只需将实际元素数据存储在另外的存储区,在顺序表原来的内存单元里保存每个元素数据的label(即引用信息,在独立存储的地址链接,实现对元素的间接访问),由于地址连接(指针)的大小肯定是一致的,所以依然保持了内存的顺序性映射。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zEYAN9Mc-1632046304857)(C:\Users\zxy\AppData\Roaming\Typora\typora-user-images\image-20210919091757199.png)]

列表的创建

  • 创建一个普通列表

    x=['Monday','Tuenday','Wednesday','Thursday','Friday']
    print(x,type(x))  #['Monday', 'Tuenday', 'Wednesday', 'Thursday', 'Friday'] <class 'list'>
    x=[2,3,4,5,6,7]
    print(x,type(x)) #[2, 3, 4, 5, 6, 7] <class 'list'>
    
  • 利用range()创建列表

    x=list(range(10))
    print(x,type(x)) 
    #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
    
    x=list(range(1,10,2))
    print(x,type(x))
    #[1, 3, 5, 7, 9] <class 'list'>
    
  • 利用推导式创建列表

    x=[i**2 for i in range(9) if i%2==0]
    print(x,type(x))
    #[0, 4, 16, 36, 64] <class 'list'>
    
    x=[0]*5
    print(x,type(x))
    #[0, 0, 0, 0, 0] <class 'list'>
    
    x=[0 for i in range(5)]
    print(x,type(x))
    #[0, 0, 0, 0, 0] <class 'list'>
    

    对每一个 i 操作之后返回的是一个 []

注意:

  • 由于list的元素可以是任何对象,因此列表中所保存的是对象的指针,即使保持一个简单的[1,2,3],也有3个指针和3个整数对象。

  • x=[a]*4的操作中,只是创建4个指向list的引用,所以一旦a改变,x中4个a也会随之改变

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZE3q6PW-1632046304860)(C:\Users\zxy\AppData\Roaming\Typora\typora-user-images\image-20210919095345413.png)]

x = [[0] * 3] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>

x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>
  • 创建一个混合列表

    mix = [1, 'lsgo', 3.14, [1, 2, 3]]
    print(mix, type(mix))  
    # [1, 'lsgo', 3.14, [1, 2, 3]] <class 'list'>
    
  • 创建一个空列表

    empty = []
    print(empty, type(empty))  # [] <class 'list'>
    

列表的操作

操作含义
list.append(obj)在列表末尾添加新的对象
list.extend(seq)在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.insert(index, obj)在编号 index 位置插入 obj
list.remove(obj)移除列表中某个值的第一个匹配项
list.pop([index=-1])移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
del var1[, var2 ……]删除单个或多个对象
start : stop : step从start(默认为0)到stop(默认为-1)以step(默认为1)切片
==「等号 ==」,只有成员、成员位置都相同时才返回True。
+ *列表拼接,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接
list.count(obj)统计某个元素在列表中出现的次数
list.index(x[, start[, end]])从列表中找出某个值第一个匹配项的索引位置
list.reverse()反向列表中元素
list.sort(key=None, reverse=False)对原列表进行排序。reverse = True 降序, reverse = False 升序(默认)

添加元素

  • list.append(obj)在列表末尾添加新的对象,只接受一个参数,参数可以是任意的数据类型,被追加的元素在list中保持着原结构类型。如果这个元素是一个list,那么这个list将会作为一个整体进行追加,注意append()extend()的区别

    • append(),list作为一个整体追加,append引用的是追加对象的地址,原list改变,被追加的list也会改变。[原有元素,[追加的list]]
    • extend(),是把两个list连接起来,extend是直接复制第二个list 的值,创建了新的存储空间,原list改变不会影响新生成的list。[原有元素,合并的list]
    NumList1 = [1,2,3]
    NumList2 = ['a','b','c']
    NumList1.append(NumList2)
    NumList2[0] = '更改第一个元素'
    print('拷贝问题',NumList1)#[1,2,3,['更改的第一个元素',b,c]]
    NumList1 = [1,2,3]
    NumList2 = ['a','b','c']
    NumList1.extend(NumList2)
    NumList2[0] = '更改第一个元素'
    print('拷贝问题',NumList1)#[1,2,3,'a','b','c']
    
    
  • list.insert(index,obj)在编号index位置插入obj。

    x=['Monday','Tuenday','Wednesday','Thursday','Friday']
    print(x,type(x))
    print(len(x))
    #['Monday', 'Tuenday', 'Wednesday', 'Thursday', 'Friday'] <class 'list'>
    5
    
    x.insert(2,'Sunday')
    print(x)
    print(len(x))
    #['Monday', 'Tuenday', 'Sunday', 'Wednesday', 'Thursday', 'Friday']
    6
    

删除元素

  • list.remove(obj)移除列表中某个值的第一个匹配项

    x=['Monday','Tuenday','Wednesday','Thursday','Friday']
    print(x,type(x))
    print(len(x))
    
    x.remove('Friday')
    print(x,type(x))
    print(len(x))
    #['Monday', 'Tuenday', 'Wednesday', 'Thursday'] <class 'list'>
    4
    
  • list.pop([index=-1])移除列表中的一个元素(默认是最后一个元素),并且返回该元素的值

    x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
    y = x.pop()
    print(y)  # Friday
    
    y = x.pop(0)
    print(y)  # Monday
    
    y = x.pop(-2)
    print(y)  # Wednesday
    print(x)  # ['Tuesday', 'Thursday']
    

    remove和pop都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引

  • del var1[,var2……]删除单个或多个对象

    x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
    del x[0:2]
    print(x)  # ['Wednesday', 'Thursday', 'Friday']
    

    如果要从列表中删除一个元素,且不再以任何方式去使用它,就可以用del语句,如果要在删除元素之后还能继续使用它,就用方法pop(),如果不知道下标值,但是知道值,可以用remove()

获取列表中的元素

  • 通过元素的索引值,从列表中获取单个元素,列表索引从0开始。
  • 通过将索引指定为-1,让python返回最后一个列表元素,索引-2返回倒数第二个列表元素,以此类推
x=['Monday','Tuenday','Wednesday',['Thursday','Friday']]
print(x[0],type(x[0])) #Monday <class 'str'>
print(x[-1],type(x[-1])) #['Thursday', 'Friday'] <class 'list'>

切片 start : stop :step

  • 情况-“start:”

  • 以step为1(默认)从编号start往列表尾部切片

    x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
    print(x[3:])  # ['Thursday', 'Friday']
    print(x[-3:])  # ['Wednesday', 'Thursday', 'Friday']
    
  • 情况-“:stop”

  • 以step为1(默认)从列表头部往编号stop切片

    week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
    print(week[:3])  # ['Monday', 'Tuesday', 'Wednesday']
    print(week[:-3])  # ['Monday', 'Tuesday']
    
  • 情况-“start : stop : step”

  • 以具体的step从编号start往编号stop切片。如果把step设为-1,相当于将列表反向排列

    week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
    print(week[1:4:2])  # ['Tuesday', 'Thursday']
    print(week[:4:2])  # ['Monday', 'Wednesday']
    print(week[1::2])  # ['Tuesday', 'Thursday']
    print(week[::-1])  
    # ['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']
    
  • “:”所有的值都为默认值——复制所有元素 x=week[:] 浅拷贝的方式去完成

列表的常用操作符

  • 等号操作符:== 只有成员、成员位置都相同时才返回true
  • 连接操作符:+ 首尾拼接
  • 重复操作符:*
  • 成员关系操作符:in、not in
list1 = [123, 456]
list2 = [456, 123]
list3 = [123, 456]

print(list1 == list2)  # False
print(list1 == list3)  # True

list4 = list1 + list2  # extend()
print(list4)  # [123, 456, 456, 123]

list5 = list3 * 3
print(list5)  # [123, 456, 123, 456, 123, 456]

list3 *= 3
print(list3)  # [123, 456, 123, 456, 123, 456]

print(123 in list3)  # True
print(456 not in list3)  # False

前面三种方法(append, extend, insert)可对列表增加元素,它们没有返回值,是直接修改了原数据对象。 而将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。

列表的其他方法

  • list.count(obj)统计某个元素在列表中出现的次数

  • list.index(x[,start[,end]])从列表中找出某个值第一个匹配项的索引位置

    list1 = [123, 456] * 5
    print(list1.index(123))  # 0
    print(list1.index(123, 1))  # 2
    print(list1.index(123, 3, 7))  # 4
    
  • list.reverse()反向列表中元素list[: :-1]

  • list.sort(key=None,reverse=False)对原列表进行排序

    • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    • reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
    • 该方法没有返回值,但是会对列表的对象进行排序。
x = [123, 456, 789, 213]
x.sort()
print(x)
# [123, 213, 456, 789]

x.sort(reverse=True)
print(x)
# [789, 456, 213, 123]


# 获取列表的第二个元素
def takeSecond(elem):    #使用def开始函数定义,def 函数名(函数参数):
    return elem[1]


x = [(2, 2), (3, 4), (4, 1), (1, 3)]
x.sort(key=takeSecond)#以第二个元素来做排序
print(x)
# [(4, 1), (2, 2), (1, 3), (3, 4)]

x.sort(key=lambda a: a[0])  #lambda 参数:返回值
print(x)#以第一个元素来做排序
# [(1, 3), (2, 2), (3, 4), (4, 1)]

浅拷贝和深拷贝

list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]

print(list2)  # [123, 456, 789, 213]
print(list3)  # [123, 456, 789, 213]
list1.sort()
print(list2)  # [123, 213, 456, 789] 
print(list3)  # [123, 456, 789, 213]

list1 = [[123, 456], [789, 213]]
list2 = list1
list3 = list1[:]
print(list2)  # [[123, 456], [789, 213]]
print(list3)  # [[123, 456], [789, 213]]
list1[0][0] = 111
print(list2)  # [[111, 456], [789, 213]]
print(list3)  # [[111, 456], [789, 213]]

元组 tuple

元组定义语法为:(元素1,元素2,……,元素n)

  • 用小括号把所有元素绑定在一起
  • 逗号将每个元素分开

创建和访问一个元组

  • Python 的元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串。
  • 元组使用小括号,列表使用方括号。
  • 元组与列表类似,也用整数来对它进行索引 (indexing) 和切片 (slicing)。
t1 = (1, 10.31, 'python')
t2 = 1, 10.31, 'python'
print(t1, type(t1))
# (1, 10.31, 'python') <class 'tuple'>

print(t2, type(t2))
# (1, 10.31, 'python') <class 'tuple'>

tuple1 = (1, 2, 3, 4, 5, 6, 7, 8)
print(tuple1[1])  # 2
print(tuple1[5:])  # (6, 7, 8)
print(tuple1[:5])  # (1, 2, 3, 4, 5)
tuple2 = tuple1[:]
print(tuple2)  # (1, 2, 3, 4, 5, 6, 7, 8)
  • 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。

  • 创建元组可以用小括号 (),也可以什么都不用,为了可读性,建议还是用 ()。

x = (1,) #只包含一个元素时,需要在元素后面添加逗号
print(type(x))  # <class 'tuple'>

print(8 * (8))  # 64
print(8 * (8,))  # (8, 8, 8, 8, 8, 8, 8, 8)

x = (1, 10.31, 'python'), ('data', 11)
print(x)
# ((1, 10.31, 'python'), ('data', 11))

print(x[0])
# (1, 10.31, 'python')
print(x[0][0], x[0][1], x[0][2])
# 1 10.31 python

print(x[0][0:2])
# (1, 10.31)

更新和删除一个元组

  • 元组中的元素值是不允许修改的,但我们可以对元组进行连接组合
tuple1=(1,2,4,5)
tuple2=tuple1[:2]+(3,)+tuple1[2:]
print(tuple2,type(tuple2))
#(1, 2, 3, 4, 5) <class 'tuple'>
  • 元组中的元素值不允许删除,我们可以使用del语句来删除整个元组

  • 元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。

t1 = (1, 2, 3, [4, 5, 6])
print(t1)  # (1, 2, 3, [4, 5, 6])

t1[3][0] = 9
print(t1)  # (1, 2, 3, [9, 5, 6])

tuple的相关操作符与list一样

内置方法

  • 元组大小和内容都不可更改,因此只有 countindex 两种方法。
t = (1, 10.31, 'python')
print(t.count('python'))  # 1  计数
print(t.index(10.31))  # 1  返回这个数的索引

解压元组

  • 解压元组
t=(1,10.31,'python',('ok','hello'))
(a,b,c,(d,e))=t;
print(a,b,c,d,e)
  • 如果只想要元组其中几个元素,用通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量。
t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c)  # 1 2 5
print(rest)  # [3, 4]

字符串 str

字符串的定义

  • Python 中字符串被定义为引号之间的字符集合。
  • Python 支持使用成对的 单引号 或 双引号。
t1 = 'i love Python!'
print(t1, type(t1))
# i love Python! <class 'str'>

t2 = "I love Python!"
print(t2, type(t2))
# I love Python! <class 'str'>

print(5 + 8)  # 13
print('5' + '8')  # 58
  • Python 的常用转义字符
转义字符描述
\\反斜杠符号
\'单引号
\"双引号
\n换行
\t横向制表符(TAB)
\r回车
  • 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
para_str = """这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
"""
print(para_str)
# 这是一个多行字符串的实例
# 多行字符串可以使用制表符
# TAB (    )。
# 也可以使用换行符 [
#  ]。

para_str = '''这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
'''
print(para_str)
# 这是一个多行字符串的实例
# 多行字符串可以使用制表符
# TAB ( 	 )。
# 也可以使用换行符 [ 
#  ]。

字符串str的切片与拼接

  • 类似于元组具有不可修改性
  • 从 0 开始 (和 Java 一样)
  • 切片通常写成 start:end 这种形式,包括「start 索引」对应的元素,不包括「end索引」对应的元素。
  • 索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。
str1 = 'I Love LsgoGroup'
print(str1[:6])  # I Love
print(str1[5])  # e
print(str1[:6] + " 插入的字符串 " + str1[6:])  
# I Love 插入的字符串  LsgoGroup

s = 'Python'
print(s)  # Python
print(s[2:4])  # th
print(s[-5:-2])  # yth
print(s[2])  # t
print(s[-1])  # n

字符串格式化

  • Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

  • 在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。

print("My name is %s and weight is %d kg!" % ('Zara', 21) )

str8 = "{0} Love {1}".format('I', 'Lsgogroup')  # 位置参数
print(str8)  # I Love Lsgogroup

str8 = "{a} Love {b}".format(a='I', b='Lsgogroup')  # 关键字参数
print(str8)  # I Love Lsgogroup

str8 = "{0} Love {b}".format('I', b='Lsgogroup')  # 位置参数要在关键字参数之前
print(str8)  # I Love Lsgogroup

str8 = '{0:.2f}{1}'.format(27.658, 'GB')  # 保留小数点后两位
print(str8)  # 27.66GB

字符串的内建函数

方法描述
string.capitalize()把字符串的第一个字符大写
string.count(str, beg=0, end=len(string))返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
string.endswith(obj, beg=0, end=len(string))检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
string.expandtabs(tabsize=8)把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。
string.find(str, beg=0, end=len(string))检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
string.format()格式化字符串
string.index(str, beg=0, end=len(string))跟find()方法一样,只不过如果str不在 string中会报一个异常.
string.isalnum()如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
string.isalpha()如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
string.isdecimal()如果 string 只包含十进制数字则返回 True 否则返回 False.
string.isdigit()如果 string 只包含数字则返回 True 否则返回 False.
string.islower()如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
string.isnumeric()如果 string 中只包含数字字符,则返回 True,否则返回 False
string.isspace()如果 string 中只包含空格,则返回 True,否则返回 False.
string.istitle()如果 string 是标题化的(见 title())则返回 True,否则返回 False
string.isupper()如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
string.join(seq)以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
string.ljust(width)返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
string.lower()转换 string 中所有大写字符为小写.
string.lstrip()截掉 string 左边的空格
string.maketrans(intab, outtab])maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
max(str)返回字符串 str 中最大的字母。
min(str)返回字符串 str 中最小的字母。
string.partition(str)有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.
string.replace(str1, str2, num=string.count(str1))把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
string.rfind(str, beg=0,end=len(string) )类似于 find() 函数,返回字符串最后一次出现的位置,如果没有匹配项则返回 -1。
string.rindex( str, beg=0,end=len(string))类似于 index(),不过是从右边开始.
string.rjust(width)返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
string.rpartition(str)类似于 partition()函数,不过是从右边开始查找
string.rstrip()删除 string 字符串末尾的空格.
string.split(str="", num=string.count(str))以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔 num+1 个子字符串
[string.splitlines(keepends])按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
string.startswith(obj, beg=0,end=len(string))检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
[string.strip(obj])在 string 上执行 lstrip()和 rstrip()
string.swapcase()翻转 string 中的大小写
string.title()返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
string.translate(str, del="")根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中
string.upper()转换 string 中的小写字母为大写
string.zfill(width)返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0

字典 dict

字典的定义

字典 是无序的 键:值(key:value)对集合,键必须是互不相同的(在同一个字典之内)。

  • dict 内部存放的顺序和 key 放入的顺序是没有关系的。
  • dict 查找和插入的速度极快,不会随着 key 的增加而增加,但是需要占用大量的内存。

字典的定义语法为{元素1,元素2,……,元素n}

  • 其中每一个元素是一个「键值对」-- 键:值 (key:value)
  • 关键点是「大括号 {}」,「逗号 ,」和「冒号 :」
  • 大括号 – 把所有元素绑在一起
  • 逗号 – 将每个键值对分开
  • 冒号 – 将键和值分开

实现原理:散列表或哈希表

字典也被称为关联数组,还称为哈希数组等。也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值。

哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。

字典(dict)数据添加:

把key通过哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。

字典(dict)数据查询:

再次使用哈希函数将key转换为对应的数组下标,并定位到数组的位置获取value。

创建和访问字典

  • 通过字符串或者数值作为key来创建字典
dic1 = {1: 'one', 2: 'two', 3: 'three'}
print(dic1)  # {1: 'one', 2: 'two', 3: 'three'}
print(dic1[1])  # one 打印key=1的value
print(dic1[4])  # KeyError: 4  没有key=4的value
  • dict()创建一个空的字典
  • 通过key直接把数据放入字典中,但一个key只能对应一个value,多次对一个key放入 value,后面的值会把前面的值冲掉。
dic=dict()
dic['a']=1
dic['b']=2
dic['c']=3
print(dic,type(dic))#{'a': 1, 'b': 2, 'c': 3}

dic['a']=0
print(dic)#{'a': 0, 'b': 2, 'c': 3}
  • 访问字典里的值:把相应的key放入[]中去访问

修改和删除字典元素

  • 向字典添加新内容的方法是增加新的键/值对
  • 能删单一的元素也能清空字典,清空只需一项操作。显示删除一个字典用del命令
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
 
del dict['Name']  # 删除键是'Name'的条目
dict.clear()      # 清空字典所有条目
del dict          # 删除字典

字典的特性

  • 字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。
  • 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住。
  • 键必须不可变,所以可以用数字,字符串或元组充当,用列表就不行。

字典的内置方法

序号函数及描述
1dict.clear() 删除字典内所有元素
2dict.copy() 返回一个字典的浅复制
3dict.fromkeys(seq[, value]) 用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
4dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回默认值。
5dict.has_key(key) 如果键在字典dict里返回true,否则返回false
6dict.items()以列表返回可遍历的 (键, 值) 元组数组。
7dict.keys()返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有键。
8dict.setdefault(key, default=None)get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
9dict.update(dict2)把字典参数 dict2key:value对 更新到字典 dict
10dict.values()返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。
11[pop(key,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
12dict.popitem()随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
13dict.pop(key[,default])删除字典给定键 key 所对应的值,返回值为被删除的值。key 值必须给出。若key不存在,则返回 default 值。
14del dict[key] 删除字典给定键 key 所对应的值

直接赋值和copy的区别

dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}

# 引用对象
dic2 = dic1  
# 浅拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dic3 = dic1.copy()  

print(id(dic1))  # 148635574728
print(id(dic2))  # 148635574728
print(id(dic3))  # 148635574344

# 修改 data 数据
dic1['user'] = 'root'
dic1['num'].remove(1)

# 输出结果
print(dic1)  # {'user': 'root', 'num': [2, 3]}
print(dic2)  # {'user': 'root', 'num': [2, 3]}
print(dic3)  # {'user': 'runoob', 'num': [2, 3]}

集合 set

Python 中setdict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key

注意,key为不可变类型,即可哈希的值。

  • 当元素顺序的重要性不如元素的唯一性和测试元素是否包含在集合中的效率时,大部分情况下set极其有用
num = {}
print(type(num))  # <class 'dict'>
num = {1, 2, 3, 4}
print(type(num))  # <class 'set'>

集合的创建

  • 先创建对象再加入元素。
  • 在创建空集合的时候只能使用s = set(),因为s = {}创建的是空字典。
basket = set()
basket.add('apple')
basket.add('banana')
print(basket)  # {'banana', 'apple'}

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket)  # {'banana', 'apple', 'pear', 'orange'}
  • 直接把一堆元素用花括号括起来{元素1, 元素2, ..., 元素n}
  • 重复元素在set中会被自动被过滤。
  • 使用set(value)工厂函数,把列表或元组转换成集合。
a = set('abracadabra')
print(a)  
# {'r', 'b', 'd', 'c', 'a'}

b = set(("Google", "Lsgogroup", "Taobao", "Taobao"))
print(b)  
# {'Taobao', 'Lsgogroup', 'Google'}

c = set(["Google", "Lsgogroup", "Taobao", "Google"])
print(c)  
# {'Taobao', 'Lsgogroup', 'Google'}

访问集合中的值

  • 可以使用len()內建函数得到集合的大小。
  • 可以使用for把集合中的数据一个个读取出来。
  • 可以通过innot in判断一个元素是否在集合中已经存在

集合的内置方法

  • set.add(elmnt)用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作

  • set.update(set)用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。

  • set.remove(item) 用于移除集合中的指定元素。如果元素不存在,则会发生错误。

  • set.discard(value) 用于移除指定的集合元素。remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会。

  • set.pop() 用于随机移除一个元素

由于 set 是无序和无重复元素的集合,所以两个或多个 set 可以做数学意义上的集合操作。

  • set1 & set2 返回两个集合的交集。
  • set1 | set2 返回两个集合的并集。
  • set1 - set2 返回集合的差集。
  • set1 ^ set2 返回集合的异或。
  • set1 <= set2 判断集合是不是被其他集合包含,如果是则返回 True,否则返回 False。
  • set1 >= set2 判断集合是不是包含其他集合,如果是则返回 True,否则返回 False
  • set.isdisjoint(set) 用于判断两个集合是不是不相交,如果是返回 True,否则返回 False。

集合的转换

se = set(range(4))
li = list(se)
tu = tuple(se)

print(se, type(se))  # {0, 1, 2, 3} <class 'set'>
print(li, type(li))  # [0, 1, 2, 3] <class 'list'>
print(tu, type(tu))  # (0, 1, 2, 3) <class 'tuple'>

不可变集合

Python 提供了不能改变元素的集合的实现版本,即不能增加或删除元素,类型名叫frozenset。需要注意的是frozenset仍然可以进行集合操作,只是不能用带有update的方法。

  • frozenset([iterable]) 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
a = frozenset(range(10))  # 生成一个新的不可变集合
print(a)  
# frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})

b = frozenset('lsgogroup')
print(b)  
# frozenset({'g', 's', 'p', 'r', 'u', 'o', 'l'})

序列

在 Python 中,序列类型包括字符串、列表、元组、集合和字典,这些序列支持一些通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。

针对序列的内置函数

  • list(sub) 把一个可迭代对象转换为列表。

  • tuple(sub) 把一个可迭代对象转换为元组。

  • str(obj) 把obj对象转换为字符串。

  • len(s) 返回对象(字符、列表、元组等)长度或元素个数。

  • max(sub)返回序列或者参数集合中的最大值。

  • min(sub)返回序列或参数集合中的最小值。

  • sum(iterable[, start=0]) 返回序列iterable与可选参数start的总和。

print(sum([1, 3, 5, 7, 9]))  # 25
print(sum([1, 3, 5, 7, 9], 10))  # 35
print(sum((1, 3, 5, 7, 9)))  # 25
print(sum((1, 3, 5, 7, 9), 20))  # 45
  • sorted(iterable, key=None, reverse=False) 对所有可迭代的对象进行排序操作。

    • iterable – 可迭代对象。
    • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    • 返回重新排序的列表。
  • reversed(seq) 函数返回一个反转的迭代器。

  • zip(iter1 [,iter2 [...]])

    • 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
    • 我们可以使用 list() 转换来输出列表。
      支持一些通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。

针对序列的内置函数

  • list(sub) 把一个可迭代对象转换为列表。

  • tuple(sub) 把一个可迭代对象转换为元组。

  • str(obj) 把obj对象转换为字符串。

  • len(s) 返回对象(字符、列表、元组等)长度或元素个数。

  • max(sub)返回序列或者参数集合中的最大值。

  • min(sub)返回序列或参数集合中的最小值。

  • sum(iterable[, start=0]) 返回序列iterable与可选参数start的总和。

print(sum([1, 3, 5, 7, 9]))  # 25
print(sum([1, 3, 5, 7, 9], 10))  # 35
print(sum((1, 3, 5, 7, 9)))  # 25
print(sum((1, 3, 5, 7, 9), 20))  # 45
  • sorted(iterable, key=None, reverse=False) 对所有可迭代的对象进行排序操作。

    • iterable – 可迭代对象。
    • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    • 返回重新排序的列表。
  • reversed(seq) 函数返回一个反转的迭代器。

  • zip(iter1 [,iter2 [...]])

    • 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
    • 我们可以使用 list() 转换来输出列表。
    • 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:45:02  更:2021-09-20 15:45:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:36:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码