Skip to content

🗃 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]

列表添加元素的方法有insertextend,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))  # 1

count(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 world

strip([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"))  # 6

replace(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,反向切片,字符串倒序

六、练习题

基础题

  1. 创建一个列表,包含 5 个任意元素,并依次打印。
  2. 向列表中插入一个元素,并删除一个元素,打印最终结果。
  3. 使用列表推导式创建一个列表,包含 1~10 的平方。
  4. 创建一个元组,尝试修改其元素,观察报错信息。
  5. 创建一个字典,添加和删除键值对,使用 get() 查询值。
  6. 遍历一个字典,打印所有键和值。
  7. 创建两个集合,求它们的并集、交集和差集。
  8. 输入一个字符串,输出其反转结果。
  9. 输入多个单词,使用空格连接成一句话。
  10. 创建一个列表,统计其中某个元素的出现次数。
  11. 给定一个列表,删除所有值为指定值的元素。
  12. 判断一个列表是否为空。
  13. 输入一个列表,输出其中的最大值和最小值。
  14. 将两个列表合并为一个列表,并去重。
  15. 创建一个元组,输出其所有元素的和。
  16. 判断一个元素是否存在于元组中。
  17. 将一个列表转换为元组,并打印。
  18. 统计一个元组中指定元素的数量。
  19. 将一个元组按索引切片输出指定部分。

综合题

  1. 输入若干对键值,创建一个字典,并输出键值对数量。
  2. 输入一个 key,判断其是否在字典中存在,并输出对应的值。
  3. 合并两个字典,输出合并后的结果。
  4. 将字典中的所有 key 和 value 颠倒,生成新字典。
  5. 字典中,统计所有 value 的总和(假设值为数值型)。
  6. 输入一个列表,使用集合去重后输出,并统计不同元素个数。
  7. 输入一个列表,按元素出现次数从多到少排序。
  8. 输入一段字符串,统计每个字符出现的次数,并以字典形式输出。
  9. 输入一个句子,统计其中单词数量,并找出最长的单词。
  10. 判断两个字符串是否为回文,并考虑大小写和空格忽略。
  11. 输入一个列表和一个数值,统计该数值出现位置索引列表。
  12. 输入一组数字,找出其中所有质数,并输出它们的和。
  13. 输入若干个字典,合并为一个大字典,重复 key 的值求和。
  14. 输入一个正整数,输出其阶乘结果。
  15. 使用 while 循环查找第一个大于 100 且能被 7 整除的平方数。
  16. 输入一组字符串,按长度从短到长排序,并按首字母排序。
  17. 输入一个句子,将其中每个单词的首字母大写,并反转句子顺序。
  18. 输入一个二维列表,按行求和输出总和列表。
  19. 编写一个程序,将列表中的负数全部替换为其绝对值后排序。
  20. 输入任意数据结构(列表/元组/集合/字符串),判断其是否为空,并输出长度。

💬 与我联系 QQ:774165314 | 微信:Yonas_Luo