Python中内置的数据结构类型详解(内置数据容器)
目录
- 1. 元组(Tuple)
- 2. 列表(List)
- 3. 字典(Dict)
- 5. 字符串(Str)
- 6. 队列(Queue)与栈(Stack)
- 6.1. 数据访问方式
- 6.1.1 队列(Queue)
- 6.1.2 栈(Stack)
- 6.2. 应用场景
- 6.3. 实现方式
- 6.4. 内存结构
- 6.5. 性能
1. 元组(Tuple)
元组是一种不可变的有序序列,用于存储固定数据。适用于需要数据保护或哈希的场景(如字典的键)。
# 1、创建元组 # 可以使用圆括号 () 或者内置的 tuple() 函数来创建元组 empty_tuple = () # 空元组 single_element = (1,) # 单元素元组(需逗号) multi_elements = (1, "a", 3.14) # 使用 tuple() 函数创建元组 from_list = tuple([4, 5, 6]) # 从列表创建元组 from_string = tuple('abc') # 从字符串创建元组 ,输出('a', 'b', 'c') # 2、双向访问与切片 # 元组支持切片操作,用于获取元组的子集 # 切片操作使用 [start:stop:step] 的语法 print(multi_elements[0]) # 输出: 1 print(multi_elements[-1]) # 输出: 3.14 print(multi_elements[1:3]) # 输出: ('a', 3.14) print(multi_elements[0::2]) # 输出:(1, 3.14) # 3、不可变性示例 try: multi_elements[0] = 10 except TypeError as e: print(f"错误: {e}") # 输出: 元组不可修改 # 4、常用方法 # 元组只有两个内置方法:count() 和 index() # count():用于返回指定元素在元组中出现的次数 # index():用于返回指定元素在元组中第一次出现的索引,如果元素不存在则引发 ValueError count = multi_elements.count(1) # 统计元素在元组中出现次数 index = multi_elements.index("a") # 查找元素索引 print(count, index) # 输出: 1 1 # 5、元组的解包 # 可以将元组中的元素解包到多个变量中 my_tuple = (10, 20, 30) a, b, c = my_tuple print(a) # 输出10 print(b) # 输出20 print(c) # 输出30 # 6、元组作为函数返回值 # 函数可以返回一个元组,方便同时返回多个值 def get_name_and_age(): return 'Alice', 25 name, age = get_name_and_age() print(name) print(age) # 7、元组的遍历 my_tuple = (1, 2, 3, 4, 5) for element in my_tuple: print(element)
2. 列表(List)
列表是可变的有序集合,支持动态增删改,适合存储动态数据。与元组不同,列表的元素可以被修改、添加或删除。
# 1、创建列表 my_list = [1, "a", 3.14] from_range = list(range(3)) # [0, 1, 2] # 2、访问与切片 my_list = [10, 20, 30, 40, 50] first_element = my_list[0] # 访问第一个元素 last_element = my_list[-1] #访问最后一个元素 subset =编程 my_list[1:3] www.devze.com# 获取从索引 1 到索引 3(不包含)的元素 every_second = my_list[0::2] # 获取从索引 0 到末尾,步长为 2 的元素 # 3、增删改操作 # 可以使用 append()、extend() 和 insert() 方法来添加元素 # 可以使用 remove()、pop() 和 del 语句来删除元素 my_list = [10, 10, 20, 30, 40, 50] my_list.append(4) # 末尾添加 my_list.extend([5, 6]) # 扩展列表,将另一个可迭代对象的元素添加到列表末尾 my_list.insert(1, 15) # 在指定索引位置插入一个元素 my_list[1] = 20 # 修改元素 my_list.remove(20) # 删除指定值的第一个匹配项 popped_element = my_list.pop(1) # 删除指定索引位置的元素,并返回该元素 del my_list[0] # 删除索引0的元素 print(my_list) # [20, 30, 40, 50, 4, 5, 6] # 4、切片与遍历 my_list = [10, 10, 20, 30, 40, 50] print(my_list[::2]) # 输出: [10, 20, 40] for idx, val in enumerate(my_list): print(f"索引{idx}: {val}") # 5、常用方法 # 列表还有 count()、index()、sort()、reverse() 等方法 my_list = [1, 2, 2, 3, 2] count_2 = my_list.count(2) # 统计元素 2 出现的次数 index_3 = my_list.index(3) # 查找元素 3 第一次出现的索引 my_list.sort() # 对列表进行排序 my_list.reverse() # 反转列表 print(count_2) # 3 print(index_3) # 3 print(my_list) # [3, 2, 2, 2, 1] # 6、列表的遍历 my_list = [1, 2, 3, 4, 5] for element in my_list: print(element) # 7、列表推导式 # 创建一个包含 1 到 5 的平方的列表 # 列表推导式是一种简洁的创建列表的方式 squares = [i ** 2 for i in range(1, 6)] print(squares) # [1, 4, 9, 16, 25]
3. 字典(Dict)
字典(dict)是一种无序、可变且以键值对形式存储数据的数据结构。字典是键值对的无序集合(python 3.7+ 有序),支持快速查询。
# 1、创建字典 # 可以使用花括号 {} 或者内置的 dict() 函数来创建字典 empty_dict = {} # 空字典 simple_dict = {'name': 'Alice', 'age': 25} # 包含键值对的字典 from_tuples = dict([('city', 'New York'), ('country', 'USA')]) from_kwargs = dict(name='Bob', age=30) # 2、访问字典元素 # 可以通过键来访问字典中的值。如果键不存在,直接访问会引发 KeyError # 解决办法在下段落,此处先不谈 my_dict = {'name': 'Alice', 'age': 25} name = my_dict['name'] # 通过键访问值 city = my_dict.get('city') # 使用 get() 方法访问值,如果键不存在,返回默认值(这里是 None) # 3、增删查改 my_dict = {'name': 'Alice', 'age': 25} my_dict['age'] = 26 # 修改已有键的值 my_dict['city'] = 'New York' # 添加新的键值对 print(my_dict) # {'name': 'Alice', 'age': 26, 'city': 'New York'} del my_dict['city'] # 使用 del 语句删除指定键的键值对 age = my_dict.pop('age') # 使用 pop() 方法删除指定键的键值对,并返回该键对应的值 print(my_dict) # {'name': 'Alice'} # 4、遍历键值 for key, value in person.items(): print(f"{key}: {value}") # 5、常用方法 # keys():返回一个包含字典所有键的视图对象。 # values():返回一个包含字典所有值的视图对象。 # items():返回一个包含字典所有键值对的视图对象。 # update():将另一个字典的键值对更新到当前字典中 my_dict = {'name': 'Alice', 'age': 25} keys = my_dict.keys() # 获取所有键 values = my_dict.values() # 获取所有值 items = my_dict.items() # 获取所有键值对 new_dict = {'city': 'Bei Jing'} # 更新字典 my_dict.update(new_dict) print(keys) # dict_keys(['name', 'age', 'city']) print(values) # dict_values(['Alice', 25, 'Bei Jing']) print(list(values)) # ['Alice', 25, 'Bei Jing'] print(itemjss) # dict_items([('name', 'Alice'), ('age', 25), ('city', 'Bei Jing')]) print(my_dict) # {'name': 'Alice', 'age': 25, 'city': 'Bei Jing'} # 6、字典推导式 # 创建一个包含 1 到 5 的平方的字典 squares_dict = {i: i ** 2 for i in range(1, 6)} print(squares_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
在 Python 中,字典(dict)是一种非常常用的数据结构,用于存储键值对。当尝试访问一个不存在的键时,直接使用 dict[key] 会导致 KeyError。为了避免这种情况,可以使用以下几种方法:
使用 get() 方法
get() 方法是字典的一个内置方法,它允许你安全地访问字典中的值。如果键不存在,get() 方法会返回一个默认值(通常是 None),而不是抛出错误。my_dict = {"a": 1, "b": 2} # 使用 get() 方法访问键 value = my_dict.get("a") # 返http://www.devze.com回 1 print(value) # 如果键不存在,返回默认值 None value = my_dict.get("c") # 返回 None print(value) # 也可以指定默认值 value = my_dict.get("c", "默认值") # 返回 "默认值" print(value)
使用 defaultdict
defaultdict 是 collections 模块中的一个类,它继承自普通的字典,但允许你指定一个默认值。当你访问一个不存在的键时,defaultdict 会自动创建一个默认值,并将其与该键关联起来。my_dict = {"a": 1, "b": 2} # 使用 get() 方法访问键 value = my_dict.get("a") # 返回 1 print(value) # 如果键不存在,返回默认值 None value = my_dict.get("c") # 返回 None print(value) # 也可以指定默认值 value = my_dict.get("c", "默认值") # 返回 "默认值" print(value)
使用 setdefault() 方法
setdefault() 方法也是字典的一个内置方法,它类似于 get(),但会在键不存在时插入一个默认值。my_dict = {"a": 1, "b": 2} # 使用 setdefault() 方法访问键 value = my_dict.setdefault("a", "默认值") # 返回 1 print(value) # 如果键不存在,插入默认值 value = my_dict.setdefault("c", "默认值") # 返回 "默认值" print(value) print(my_dict) # 输出:{'a': 1, 'b': 2, 'c': '默认值'}
4. 集合(Set)
集合(set)是一种无序且唯一的数据结构,它不允许有重复的元素,常用于去重、成员检测和集合运算(如并集、交集、差集等)。
# 1、创建集合 str = set() # set() 是创建空集合的唯一方式,str = {}是空字典 my_set = {1, 2, 2, 3} # 自动去重 → {1, 2, 3} from_list = set([3, 4, 5]) fruits = {'apple', 'banana', 'cherry'} # 2、访问集合元素 # 由于集合是无序的,不能通过索引来访问元素。但可以使用 for 循环遍历集合中的元素,或者使用 in 关键字检查元素是否存在于集合中 ```python fruits = {'apple', 'banana', 'cherry'} # 遍历集合 for fruit in fruits: print(fruit) # 检查元素是否存在 is_apple_in = 'apple' in fruits print(is_apple_in) # True # 3、添加元素 # 可以使用 add() 方法向集合中添加单个元素,使用 update() 方法添加多个元素(可以是列表、元组、集合等可迭代对象) fruits = {'apple', 'banana'} # 添加单个元素 fruits.add('cherry') # 添加多个元素 fruits.update(['date', 'elderberry']) print(fruits) # {'apple', 'banana', 'cherry', 'elderberry', 'date'} # 4、删除元素 # 可以使用 remove()、discard() 和 pop() 方法来删除集合中的元素 # remove():如果元素存在,将其从集合中移除;若元素不存在,会引发 KeyError # discard():如果元素存在,将其从集合中移除;若元素不存在,不会引发错误 # pop():随机移除并返回集合中的一个元素,若集合为空,会引发 KeyError fruits = {'apple', 'banana', 'cherry'} # 使用 remove() 方法删除元素 fruits.remove('apple') # 使用 discard() 方法删除元素 fruits.discard('banana') # 使用 pop() 方法删除元素 popped_fruit = fruits.pop() # 5、集合的常用操作 ## 5.1并集:可以使用 | 运算符或 union() 方法实现 set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 | 运算符求并集 union_set1 = set1 | set2 # 使用 union() 方法求并集 union_set2 = set1.union(set2) print(union_set1) # {1, 2, 3, 4, 5} print(union_set2) # {1, 2, 3, 4, 5} ## 5.2交集:可以使用 & 运算符或 intersection() 方法实现 set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 & 运算符求交集 intersection_set1 = set1 & set2 # 使用 intersection() 方法求交集 intersection_set2 = set1.intersection(set2) print(intersection_set1) # {3} print(intersection_set2) # {3} #编程客栈# 5.3差集:可以使用 - 运算符或 difference() 方法实现 set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 - 运算符求差集 difference_set1 = set1 - set2 # 使用 difference() 方法求差集 difference_set2 = set1.difference(set2) print(difference_set1) # {1, 2} print(difference_set2) # {1, 2} ## 5.4对称差集:可以使用 ^ 运算符或 symmetric_difference() 方法实现 set1 = {1, 2, 3} set2 = {3, 4, 5} # 使用 ^ 运算符求对称差集 symmetric_difference_set1 = set1 ^ set2 # 使用 symmetric_difference() 方法求对称差集 symmetric_difference_set2 = set1.symmetric_difference(set2) print(symmetric_difference_set1) # {1, 2, 4, 5} print(symmetric_difference_set2) # {1, 2, 4, 5} # 6、集合的长度 # 可以使用 len() 函数获取集合中元素的数量 fruits = {'apple', 'banana', 'cherry'} length = len(fruits) print(length) # 3 # 7、清空集合 # 可以使用 clear() 方法清空集合中的所有元素 fruits = {'apple', 'banana', 'cherry'} fruits.clear() print(fruits) # set()
5. 字符串(Str)
字符串是不可变的字符序列,支持文本处理和格式化。
# 创建字符串 s = "Hello, 世界!" multiline = """多行 字符串""" # 切片与操作 print(s[0:5]) # 输出: Hello print(s.upper()) # 转为大写 # 常用方法 words = s.split(",") # 分割 → ['Hello', ' 世界!'] joined = '-'.join(words) # 合并 → "Hello-世界!" # 格式化 name = "Alice" print(f"Name: {name}") # 输出: Name: Alice
6. 队列(Queue)与栈(Stack)
队列(FIFO):用 deque 实现。
栈(LIFO):用列表的 append 和 pop 实现。队列(Queue)和栈(Stack)是两种常见的数据结构,它们在数据存储和访问方式上有很大的区别。以下是它们的主要区别:6.1. 数据访问方式
6.1.1 队列(Queue)
特点:先进先出(FIFO,First In First Out)。最早进入队列的元素会最先被移除。
操作:入队(Enqueue):在队列的尾部添加一个元素。出队(Dequeue):从队列的头部移除一个元素。查看队首元素(Peek):查看队列头部的元素,但不移除它。6.1.2 栈(Stack)
特点:后进先出(LIFO,Last In First Out)。最后进入栈的元素会最先被移除。
操作:入栈(Push):在栈的顶部添加一个元素。出栈(Pop):从栈的顶部移除一个元素。查看栈顶元素(Peek):查看栈顶的元素,但不移除它。# 队列示例 from collections import deque queue = deque([1, 2, 3]) queue.append(4) # 入队 print(queue.popleft()) # 出队 → 1 # 栈示例 stack = [] stack.append(10) # 入栈 print(stack.pop()) # 出栈 → 10
6.2. 应用场景
队列(Queue)
任务调度:操作系统中的任务调度,按照任务到达的顺序执行。消息队列:在多线程或多进程环境中,用于传递消息。打印队列:打印机按照任务提交的顺序打印文档。广度优先搜索(BFS):在图的遍历中,队列用于存储待访问的节点。栈(Stack)
函数调用:程序运行时,函数调用的上下文(如局部变量、返回地址等)存储在栈中。表达式求值:计算算术表达式的值,如逆波兰表达式。括号匹配:检查括号是否正确匹配。深度优先搜索(DFS):在图的遍历中,栈用于存储待访问的节点。撤销操作(Undo):在软件中实现撤销功能,如文本编辑器中的撤销操作。6.3. 实现方式
队列(Queue)
Python 实现:可以使用 collections.deque,它是一个双端队列,支持高效的头部和尾部操作。from collections import deque queue = deque() queue.append(1) # 入队 queue.append(2) queue.append(3) print(queue.popleft()) # 出队,输出 1
栈(Stack)
Python 实现:可以使用普通的列表(list),利用 append() 和 pop() 方法来模拟栈的操作。stack = [] stack.append(1) # 入栈 stack.append(2) stack.append(3) print(stack.pop()) # 出栈,输出 3
6.4. 内存结构
队列(Queue)
队列的元素顺序是固定的,新元素总是添加到尾部,旧元素总是从头部移除。队列的头部和尾部可以动态变化。队列通常需要维护两个指针(头部指针和尾部指针)来跟踪元素的位置。栈(Stack)栈的元素顺序是动态的,新元素总是添加到顶部,旧元素也总是从顶部移除。栈的顶部位置会不断变化。栈通常只需要维护**一个指针(栈顶指针)**来跟踪元素的位置。6.5. 性能
队列(Queue)
使用 collections.deque 时,队列的头部和尾部操作(入队、出队)的时间复杂度为 O(1)。栈(Stack)使用列表(list)时,栈的入栈和出栈操作的时间复杂度为 O(1)。总结:数据结构对比表
精彩评论