Appearance
🗃 Python 内置数据结构
数据结构是在计算机中组织和存储数据的一种方式,它决定了数据如何存储、访问和修改。
- 数据结构就是数据的容器和组织方式。
- 它可以让我们更高效地完成任务,比如查找、排序、统计和修改数据。
Python 内置了常用的数据结构:
- 列表(List)
- 元组(Tuple)
- 字典(Dictionary)
- 集合(Set)
- 字符串(String)
一、列表(List)
列表是 Python 最常用的数据结构,可变、支持任意类型元素。
1. 创建列表
列表的元素可以是多种类型的,而且可以混用。
python
lst = [] # 空列表
lst = [1, 2, 3, 'a', True] # 列表
lst = list((1, 2, 3)) # 转换为列表
lst = [1,2,[3,4,5]] # 嵌套列表IMPORTANT
列表可以给另一个列表赋值,但是它们之间互相影响。如果需要真正意义的复制,需要用到深度拷贝函数。
python
lst1 = [1, 4, 3, 2]
lst2 = lst1
lst1.append(3)
print(lst2) # [1, 4, 3, 2, 3]2. 常用操作
append(x)
- 功能:在列表末尾添加一个元素。
- 参数:
x:任意对象。
python
lst = [1, 2]
lst.append(3)
print(lst) # [1, 2, 3]insert(index, x)
- 功能:在指定位置插入一个元素。
- 参数:
index:插入位置索引,x:任意对象。
python
lst = [1, 2]
lst.insert(1, 100)
print(lst) # [1, 100, 2]extend(iterable)
- 功能:将一个可迭代对象的所有元素添加到列表。
python
lst = [1, 2]
lst.extend([3, 4])
print(lst) # [1, 2, 3, 4]数学运算
加法 +:拼接
python
a = [1, 2]
b = [3, 4]
print(a + b) # [1, 2, 3, 4]乘法 *:重复
python
a = [1, 2]
print(a * 3) # [1, 2, 1, 2, 1, 2]列表添加元素的方法有
insert和extend,append他们都会修改到原来的类别,但是对于+和*操作,它们会返回一个新的列表。
remove(x)
- 功能:删除列表中第一个值为 x 的元素。如果不存在,程序抛出异常。
- 注意:如果没有该值会报错。
python
lst = [1, 2, 3, 2]
lst.remove(2)
print(lst) # [1, 3, 2]pop([index])
- 功能:删除指定索引的元素,并返回该元素。如果不指定,删除最后一个。
python
lst = [1, 2, 3]
lst.pop()
print(lst) # [1, 2]clear()
- 功能:清空列表。
sort(reverse=False)
- 功能:列表排序(原地排序,列表本身被改变了)
- 参数:
reverse:True 降序,False 升序。
python
lst = [3, 1, 2]
lst.sort()
print(lst) # [1, 2, 3]reverse()
- 功能:反转列表顺序。
- 参数:无
index(x, [start, end])
功能:查找某个值的位置,可以指导在某个区间查找
参数:
x:要查找的元素。start(可选):从列表的哪个索引开始查找,默认是 0(从头开始)。end(可选):查找到哪个索引结束(不包括该索引),默认是列表长度(到尾部)
count(x)
- 功能:返回 x 在列表中出现的次数。
- 参数:
x:需要查找的 x 的值
切片:lst[start:end:step]
功能:从列表中取出一部分元素,形成一个新列表。
参数:
start:起始索引(包含该位置),默认是 0。end:结束索引(不包含该位置),默认是列表长度。step:步长,默认是 1。负数表示反向切片。
python
lst = [0, 1, 2, 3, 4]
print(lst[1:4]) # [1, 2, 3]
print(lst[1:5:2]) # [1,3]
print(lst[:5:2]) # [0,2,4]
print(lst[::-1]) # [4, 3, 2, 1, 0] 列表颠倒TIP
列表切片会返回一个新的列表,所以列表本身不会被改变。
推导式:[表达式 for 变量 in 可迭代对象]
表达式:对变量进行操作,产生新的值。
变量:从可迭代对象中依次取出的元素。
可迭代对象:比如列表、字符串、range等。
python
lst = [x * 2 for x in range(5)]列表推导式还可以加 if 条件,过滤不符合条件的元素。
python
# 生成 0~9 中偶数的平方
evens = [x**2 for x in range(10) if x % 2 == 0]
print(evens) # 输出: [0, 4, 16, 36, 64]二、元组(Tuple)
元组和列表类似,但不可修改(不可变对象)。
1. 创建元组
python
tpl = (1, 2, 3)
tpl = tuple([4, 5])2. 常用操作
index(x)
- 功能:返回指定值第一次出现的位置。
- 参数:
x: 要查找的元素。
python
tpl = (1, 2, 3, 2)
print(tpl.index(2)) # 1count(x)
- 功能:返回指定值出现的次数。
- 参数:
x: 要查找的元素。
python
tpl = (1, 2, 2, 3)
print(tpl.count(2)) # 2访问元素(通过索引)
python
tpl = (10, 20, 30)
print(tpl[0]) # 10遍历
python
tpl = (1, 2, 3)
for item in tpl:
print(item)三、字典(Dictionary)
字典存储键值对(key-value),可以通过键来访问,修改字典。
python
dict_1 = {key:value}
dict_2 = {key1:value1,key2:value2}每个键必须是可哈希的(hash() 函数能用),所以键通常是:
- 数字、字符串、元组(元素也必须可哈希)
- 不可以是列表、字典这种可变类型。
1. 创建字典
python
d = {'name': 'Tom', 'age': 20,(10,2):'black'}
print(d[(10,2)]) # black
d = dict(name='Tom', age=20)
print(d) # {'name': 'Tom', 'age': 20}2. 常用操作
访问与修改
python
print(d['name'])
d['age'] = 30添加
python
d['gender'] = 'male'删除
- pop(key[, default]):删除指定键。
- clear():清空
- del d[key]
get(key, default=None)
功能:从字典中获取指定键
key对应的值。 如果键不存在,则返回default(默认是None),不会抛出异常。参数:
key:要查找的键(必填)。default(可选):键不存在时返回的默认值,默认是None。
python
print(d.get('height', '未知'))keys()
- 功能:返回所有键。
values()
- 功能:返回所有值。
items()
- 功能:返回所有键值对(元组形式)。
python
for k in d.keys(): # 等同于 for k in d
print(k)
for v in d.values():
print(v)
for k, v in d.items():
print(k, v)NOTE
字典不支持切片的操作
四、集合(Set)
集合用于去重和集合运算,元素无序不重复。
1. 创建集合
python
s = {1, 2, 3}
s = set([1, 2, 2, 3])集合在设计上只关心‘有没有’,不关心‘排第几’。由于集合是无序的,所以无法通过下标(索引)的方式去访问。如果你想知道某一个集合里面都有哪些元数据,可以通过for x in set的方式。
2. 常用操作
add(x)
- 功能:添加元素到集合中。
- 参数:
- x :添加的元素
python
s = {1, 2}
s.add(3)
print(s)remove(x)
- 功能:删除列表中第一个值为 x 的元素。如果不存在,程序抛出异常。
- 参数:
x:删除的元素
python
s.remove(2)discard(x)
- 功能:删除指定元素,如果不存在不会报错。
- 参数:
x:删除的元素
union(set)
- 功能:求并集。
- 参数:
set另外一个集合
python
print(s.union({4, 5}))intersection(set)
- 功能:求交集。
- 参数:
set另外一个集合
python
# intersection() 求交集:返回两个集合中都存在的元素
s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}
print(s1.intersection(s2)) # 输出: {3, 4}difference(set)
- 功能:求差集。
- 参数:
set另外一个集合
python
# difference() 求差集:返回第一个集合有但第二个集合没有的元素
print(s1.difference(s2)) # 输出: {1, 2}
print(s2.difference(s1)) # 输出: {5, 6}IMPORTANT
集合的操作可以用符号简便的表示:
python
s1 = {1, 2, 3}
s2 = {3, 4, 5}
print(s1 | s2) # 并集,等同于 s1.union(s2),输出: {1, 2, 3, 4, 5}
print(s1 & s2) # 交集,等同于 s1.intersection(s2),输出: {3}
print(s1 - s2) # 差集,等同于 s1.difference(s2),输出: {1, 2}五、字符串(String)
字符串是 Python 最常用的数据类型之一,属于不可变类型。
1. 常用操作
大小写转换
- upper():转为大写
- lower():转为小写
- capitalize():首字母大写
- title():每个单词首字母大写
python
s = "hello world"
print(s.upper()) # HELLO WORLD
print(s.capitalize()) # Hello worldstrip([chars])
- 功能:去除字符串首尾指定字符(默认为空格)
- 参数:
- 需要去除的字符
python
s = " hello world "
print(s.strip()) # "hello world"find(sub[, start[, end]])
- 功能:在字符串里查找子字符串
sub第一次出现的位置(索引)。 找不到时返回-1,不会报错。 - 参数:
sub:要查找的子字符串(必填)。start(可选):开始查找的起始索引,默认从0开始。end(可选):查找的结束索引(不包含该位置),默认查到字符串末尾。
python
s = "hello world"
print(s.find("world")) # 6replace(old, new[, count])
- 功能:将字符串中出现的子串
old替换成new。 可以指定替换次数,默认全部替换。 - 参数:
old:要被替换的子串(必填)。new:替换成的子串(必填)。count(可选):替换的最大次数,默认替换所有出现的。
python
s = "hello world world"
print(s.replace("world", "Python")) # 替换所有,输出 "hello Python Python"
print(s.replace("world", "Python", 1)) # 只替换第一个,输出 "hello Python world"print(s.replace("world", "Python"))split(sep=None, maxsplit=-1)
- 功能:将字符串按照指定分隔符拆分成列表。 如果不指定分隔符,默认按任意空白字符(空格、换行、制表符等)拆分。 可以指定拆分次数。
- 参数:
sep(可选):分隔符字符串,默认是None,表示按任意空白字符拆分。maxsplit:最大切割次数,值为-1表示不限次数。
python
s = "a,b,c"
print(s.split(",")) # ['a', 'b', 'c']join(iterable)
- 功能:用当前字符串作为分隔符连接成一个新的字符串,可以是空字符串。
- 参数:
iterable:一个可迭代对象,里面的元素都必须是字符串。
python
lst = ["a", "b", "c"]
print(",".join(lst)) # a,b,c
print("-".join(lst)) # a-b-c格式化
python
name = "Tom"
age = 20
print(f"姓名:{name}, 年龄:{age}")切片:lst[start:end:step]
功能:从列表中取出一部分元素,形成一个新的字符串。
参数:
start:起始索引(包含该位置),默认是 0( step > 0 情况下)。end:结束索引(不包含该位置),默认是列表长度 step > 0 情况下)。step:步长,默认是 1。负数表示反向切片。
python
s = "abcdefg"
print(s[1:4]) # bcd,索引 1 到 3
print(s[:5]) # abcde,从头到索引 4
print(s[2:]) # cdefg,从索引 2 到末尾
print(s[::2]) # aceg,步长 2
print(s[::-1]) # gfedcba,反向切片,字符串倒序六、练习题
基础题
- 创建一个列表,包含 5 个任意元素,并依次打印。
- 向列表中插入一个元素,并删除一个元素,打印最终结果。
- 使用列表推导式创建一个列表,包含 1~10 的平方。
- 创建一个元组,尝试修改其元素,观察报错信息。
- 创建一个字典,添加和删除键值对,使用
get()查询值。 - 遍历一个字典,打印所有键和值。
- 创建两个集合,求它们的并集、交集和差集。
- 输入一个字符串,输出其反转结果。
- 输入多个单词,使用空格连接成一句话。
- 创建一个列表,统计其中某个元素的出现次数。
- 给定一个列表,删除所有值为指定值的元素。
- 判断一个列表是否为空。
- 输入一个列表,输出其中的最大值和最小值。
- 将两个列表合并为一个列表,并去重。
- 创建一个元组,输出其所有元素的和。
- 判断一个元素是否存在于元组中。
- 将一个列表转换为元组,并打印。
- 统计一个元组中指定元素的数量。
- 将一个元组按索引切片输出指定部分。
综合题
- 输入若干对键值,创建一个字典,并输出键值对数量。
- 输入一个 key,判断其是否在字典中存在,并输出对应的值。
- 合并两个字典,输出合并后的结果。
- 将字典中的所有 key 和 value 颠倒,生成新字典。
- 字典中,统计所有 value 的总和(假设值为数值型)。
- 输入一个列表,使用集合去重后输出,并统计不同元素个数。
- 输入一个列表,按元素出现次数从多到少排序。
- 输入一段字符串,统计每个字符出现的次数,并以字典形式输出。
- 输入一个句子,统计其中单词数量,并找出最长的单词。
- 判断两个字符串是否为回文,并考虑大小写和空格忽略。
- 输入一个列表和一个数值,统计该数值出现位置索引列表。
- 输入一组数字,找出其中所有质数,并输出它们的和。
- 输入若干个字典,合并为一个大字典,重复 key 的值求和。
- 输入一个正整数,输出其阶乘结果。
- 使用 while 循环查找第一个大于 100 且能被 7 整除的平方数。
- 输入一组字符串,按长度从短到长排序,并按首字母排序。
- 输入一个句子,将其中每个单词的首字母大写,并反转句子顺序。
- 输入一个二维列表,按行求和输出总和列表。
- 编写一个程序,将列表中的负数全部替换为其绝对值后排序。
- 输入任意数据结构(列表/元组/集合/字符串),判断其是否为空,并输出长度。