百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Python列表、元组、字典和集合_python 元组 列表 字典

wptr33 2025-09-29 13:40 19 浏览

Python 中的列表(List)、元组(Tuple)、字典(Dict)和集合(Set)是四种最常用的核心数据结构。掌握它们的基础操作只是第一步,真正发挥威力的是那些高级用法和技巧

首先我们先看一下这4种类型的详细对比,确定我们在开发的时候怎么选择使用哪一种类型。

数据结构

是否可变

是否有序

元素是否唯一

查找效率

内存结构

典型应用

列表

(List)

可变

有序

允许重复

O(n)

动态指针数组

动态有序数据

元组

(Tuple)

不可变

有序

允许重复

O(n)

静态指针数组

不变数据,作字典键

字典

(Dict)

可变

插入序

Key唯一

O(1)

哈希表

键值映射,快速查找

集合

(Set)

可变

无序

元素唯一

O(1)

哈希表(仅键)

去重,集合运算

总结与选择建议:

  • 需要存储一个有序且可能变化的序列吗? -> 选择 列表
  • 需要存储一组不可变的、作为键或保证安全的数据吗? -> 选择 元组
  • 需要通过唯一的键来快速查找和关联值吗? -> 选择 字典
  • 需要保证元素的唯一性,或进行集合运算(如去重、求交集并集)吗? -> 选择 集合

列表 (List) 的高级用法

列表的强大远超基础的增删改查。

  1. 列表推导式 (List Comprehension)

这是编写 Pythonic 代码的利器,它用简洁的语法快速生成新列表

# 基础:快速生成平方数列表 
squares = [x**2 for x in range(10)]# [0, 1, 4, 9, ..., 81] 

# 带条件过滤:生成偶数的平方 
even_squares = [x**2 for x in range(10) if x % 2 == 0]# [0, 4, 16, 36, 64] 

# 多重循环:模拟嵌套循环,生成全排列 
pairs = [(x, y) for x in ['A', 'B'] for y in [1, 2]] 
# 结果: [('A', 1), ('A', 2), ('B', 1), ('B', 2)]
  1. 切片赋值与高级切片

切片不仅可以取数据,还可以批量修改、删除甚至插入数据

my_list = [1, 2, 3, 4, 5] 

# 批量替换子序列 my_list[1:4] = [20, 30, 40]# my_list 变为 [1, 20, 30, 40, 5] 

# 批量删除子序列 (用空列表替换) my_list[1:4] = []# my_list 变为 [1, 5] 

# 使用步长进行间隔替换(数量必须匹配) my_list[::2] = [100, 200]# 将第1、3个元素替换为100, 200
  1. 与 map, filter, zip等函数式工具结合

这些内置函数让列表处理更高效和声明式。

numbers = ['1', '2', '3'] 

# map: 将函数应用于列表每个元素 int_list = list(map(int, numbers))  # [1, 2, 3] 

# filter: 过滤列表中满足条件的元素 even_list = list(filter(lambda x: x % 2 == 0, [1,2,3,4]))  # [2, 4] 

# zip: 将多个列表对应位置的元素"打包"成元组 
names = ['Alice', 'Bob'] 
scores = [85, 92] 
zipped = list(zip(names, scores))  # [('Alice', 85), ('Bob', 92)] 

# 用zip优雅地同步遍历多个列表 
for name, score in zip(names, scores): 
		print(f"{name}: {score}")
  1. 性能注意事项
  • 列表在尾部进行 append和 pop操作很快(O(1)时间复杂度)。
  • 头部或中部进行 insert或 pop操作可能较慢(O(n)时间复杂度),因为需要移动后续元素。
  • 对于需要频繁在两端进行添加或删除操作的场景,可以考虑使用 collections.deque(双端队列),它在队列两端都有出色的性能表现。

元组 (Tuple) 的高级用法

元组的“不可变性”是其核心优势,带来了安全、高效和可哈希的特性。

  1. 解包 (Unpacking)

这是元组最优雅的特性之一,可以一次性将元组元素赋值给多个变量

# 基本解包 
point = (10, 20) 
x, y = point# x=10, y=20 

# 使用 * 进行可变长度解包 (Python 3) 
numbers = (1, 2, 3, 4, 5) 
first, *middle, last = numbers# first=1, middle=[2,3,4], last=5 
a, *b, c, d = numbers# a=1, b=[2,3], c=4, d=5 

# 在循环中解包 
for name, score in zipped:# 接上文zip的例子 
		print(f"{name}'s score is {score}") 

# 使用下划线 _ 忽略不需要的值 
name, _, salary = ("Alice", "Engineer", 50000)  # 忽略职位
  1. 作为字典的键或集合的元素

由于元组是不可变的、可哈希的,它可以作为字典的键,这是列表无法做到的

# 用元组表示坐标,作为字典的键 
location_map = {
      (40.7128, -74.0060): "New York",
      (34.0522, -118.2437): "Los Angeles"
} 
print(location_map[(40.7128, -74.0060)])# 输出: New York 

# 元组也可以放入集合中(需确保所有元素都可哈希) 
unique_points = {(1, 2), (3, 4), (1, 2)}    # {(1, 2), (3, 4)}
  1. 命名元组 (Named Tuple)

collections.namedtuple让元组不仅有序号,还有了名字,极大提升了代码的可读性

from collections import namedtuple 

# 定义一个命名元组类型 'Person' 
Person = namedtuple('Person', ['name', 'age', 'job']) 

# 创建命名元组实例 
alice = Person(name="Alice", age=30, job="Engineer") 

# 通过字段名访问,意义明确 
print(alice.name)    # Alice 
print(alice.job)    # Engineer 

# 仍然支持索引访问 
print(alice[0])    # Alice
  1. 函数返回多个值

本质上,Python 函数返回多个值就是返回一个元组

def calculate_stats(data): 
		total = sum(data)
		count = len(data) 
		average = total / count return total, count, average    # 返回一个元组 (total, count, average) 

# 接收返回值时常用解包 
total, count, avg = calculate_stats([1, 2, 3, 4, 5])

字典 (Dict) 的高级用法

字典的核心在于基于键的快速查找(O(1)平均时间复杂度)。

  1. 字典推导式 (Dict Comprehension)

与列表推导式类似,可以快速简洁地创建字典

# 快速创建键值对 
squares = {x: x*x for x in range(5)}# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} 

# 交换键和值(前提是值都是可哈希的) 
original = {'a': 1, 'b': 2} 
swapped = {v: k for k, v in original.items()}# {1: 'a', 2: 'b'} 

# 带条件的推导式 
even_squares = {x: x*x for x in range(10) if x % 2 == 0}
  1. setdefault和 get方法安全访问

这些方法可以优雅地处理键可能不存在的情况,避免 KeyError。

my_dict = {'name': 'Alice', 'age': 30} 
# get(key, default): 键不存在时返回默认值,不会引发异常 
job = my_dict.get('job', 'Unemployed')# 'Unemployed' 
age = my_dict.get('age')# 30 

# setdefault(key, default): 键不存在时,设置键值并返回默认值;键存在则返回对应的值 
# 常用于初始化列表、集合等值,避免重复判断 
data = {} 
for item in ['A', 'B', 'A', 'C']: 
		# 如果键不存在,将键对应的值初始化为空列表,然后追加元素 
    data.setdefault(item, []).append(f"Value_{item}") 
# data: {'A': ['Value_A', 'Value_A'], 'B': ['Value_B'], 'C': ['Value_C']}
  1. 字典合并 (Merging Dictionaries)

有多种方式可以将多个字典合并为一个。

d1 = {'a': 1, 'b': 2} 
d2 = {'b': 3, 'c': 4}    # 注意键 'b' 重复 

# 方法1: {**d1, **d2} (Python 3.5+) 
merged = {**d1, **d2}    # {'a': 1, 'b': 3, 'c': 4},后面的值覆盖前面的 

# 方法2: d1.update(d2) (原地修改d1) 
d1.update(d2)    # d1 变为 {'a': 1, 'b': 3, 'c': 4} 

# 方法3: collections.ChainMap (逻辑合并,不创建新字典) 
from collections import ChainMap 
chain = ChainMap(d1, d2)    # 按顺序查找键
  1. 使用 collections模块中的特殊字典

defaultdict: 提供默认值工厂,简化初始化。

from collections import defaultdict 

# 初始化一个默认值为列表的字典 list_dict = defaultdict(list) 
list_dict['fruits'].append('apple')# 无需先判断键是否存在 

# 初始化一个默认值为0的字典(用于计数) 
count_dict = defaultdict(int) 
for word in ['apple', 'banana', 'apple']: 
		count_dict[word] += 1# 第一次遇到'apple'时,初始值就是0 
# count_dict: defaultdict(<class 'int'>, {'apple': 2, 'banana': 1})
  1. Counter: 专为计数设计的字典子类。
from collections import Counter 
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'] 
word_count = Counter(words) 
print(word_count)			# Counter({'apple': 3, 'banana': 2, 'orange': 1}) 
print(word_count.most_common(2))			# [('apple', 3), ('banana', 2)]

集合 (Set) 的高级用法

集合的核心是唯一性数学集合操作

  1. 集合推导式 (Set Comprehension)

与列表推导式类似,用于创建集合,自动去重。

# 创建一个包含平方数的集合(自动去重) 
numbers = [1, 2, 2, 3, 4, 4, 4] 
unique_squares = {x*x for x in numbers}			# {1, 4, 9, 16}
  1. 强大的集合运算

集合支持并集、交集、差集、对称差集等数学运算。

set_a = {1, 2, 3, 4} 
set_b = {3, 4, 5, 6} 

# 并集 (Union): 所有在A或B中的元素 
print(set_a | set_b)# {1, 2, 3, 4, 5, 6} 
print(set_a.union(set_b))# 同上 

# 交集 (Intersection): 所有同时在A和B中的元素 
print(set_a & set_b)# {3, 4} 
print(set_a.intersection(set_b))# 同上 

# 差集 (Difference): 在A中但不在B中的元素 
print(set_a - set_b)# {1, 2} 
print(set_a.difference(set_b))# 同上 

# 对称差集 (Symmetric Difference): 在A或B中,但不同时在两者中的元素 
print(set_a ^ set_b)# {1, 2, 5, 6} 
print(set_a.symmetric_difference(set_b))# 同上 

# 子集/超集判断 
print({1, 2}.issubset(set_a))			# True 
print(set_a.issuperset({1, 2}))			# True
  1. 从序列中快速去除重复项

这是集合最常用的场景之一。

my_list = [1, 2, 2, 3, 4, 4, 4, 5]
unique_list = list(set(my_list))			# [1, 2, 3, 4, 5] (顺序可能改变)

# 如果需要保持原始顺序,可以使用字典(Python 3.7+字典有序)
unique_list_ordered = list(dict.fromkeys(my_list).keys())			# [1, 2, 3, 4, 5]

相关推荐

深度剖析 MySQL 数据库索引失效场景与优化策略

在互联网软件开发领域,MySQL数据库凭借其开源、高效等特性被广泛应用。而索引,作为提升MySQL查询性能的关键利器,能大幅加速数据检索。然而,在实际开发中,即便精心创建了索引,却常常遭遇索引失...

15分钟,带你了解indexedDB,这个前端存储方案很重要!

原文来源于:程序员成长指北;作者:Django强哥如有侵权,联系删除最近在给前端班授课,在这次之前的最后一次课已经是在2年前,2年的时间,前端的变化很大,也是时候要更新课件了。整理客户端存储篇章时模糊...

MySQL 面试总被问到的那些问题,你都懂了吗?

事务的四大特性是什么?首先得提一下ACID,这可是数据库事务的灵魂所在:原子性(Atomicity):要么全部成功,要么全部失败回滚。一致性(Consistency):确保数据在事务前后都处于一致状态...

Java 字符串常见的操作_java字符串总结

在Java当中,为字符串类提供了丰富的操作方法,对于字符串,我们常见的操作就是:字符串的比较、查找、替换、拆分、截取以及其他的一些操作。在Java中,有String,StringBuffer和St...

java学习分享:Java截取(提取)子字符串(substring())

在String中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。1.substring(intbeginIndex)形...

你必须知道的 7 个杀手级 JavaScript 单行代码

1.如果你需要一个临时的唯一ID,请生成随机字符串。这个例子将为你生成一个随机字符串:constrandomString=Math.random().toString(36).slice(2)...

MySQL 索引失效:原因、场景与解决方案

在互联网软件开发领域,MySQL作为一款广泛使用的关系型数据库,其性能优化至关重要。而索引,作为提升MySQL查询性能的关键手段,一旦失效,会导致查询效率大幅下降,影响整个系统的性能。今天,就来...

Axure9 教程:可模糊搜索的多选效果

一、交互效果说明1.点击话题列表中的话题选项,上方输入框内显示选择的话题标签,最多可选择5个标签,超出将有文字提示。2.点击输入框内已选择的话题标签的删除按钮,可以删除已选择的话题标签,并且该标签返回...

JavaScript字符串操作方法大全,包含ES6方法

一、charAt()返回在指定位置的字符。...

为什么MySQL索引不生效?来看看这8个原因

在数据库优化中,最让人头疼的事情之一莫过于精心设计的索引没有发挥作用。为什么会出现这种情况?这篇文章带大家一起探讨一些常见原因,方便大家更好地理解MySQL查询优化器是如何选择索引的,以及在出现类...

Kettle实现rabbitMQ的生产与消费_rabbitmq不支持顺序消费

文章目录一、Kettle为什么可以读取流数据?...

MySQL高频函数Top10!数据分析效率翻倍,拒绝无效加班!

引言:为什么你的SQL代码又臭又长?“同事3行代码搞定的事,你写了30行?”“每次处理日期、字符串都抓狂,疯狂百度?”——不是你不努力,而是没掌握这些高频函数!本文精炼8年数据库开发经验,总结出10个...

mysql的截取函数用法详解_mysql截取指定字符

substring()函数测试数据准备:用法:以下语法是mysql自动提示的1:substirng(str,pos):从指定位置开始截取一直到数据完成str:需要截取的字段的pos:开始截取的位置。从...

MySQL函数:字符串如何截取_mysql 字符串截取函数

练习截取字符串函数(五个)mysql索引从1开始...

数据集成产品分析(一)_数据集成工具有哪些

编辑导语:数据集成产品是数据中台建设的第一环节,在构建数据中台或大数据系统时,首先要将企业内部各个业务系统的数据实现互联互通,从物理上打破数据孤岛。本文作者对数据集成产品进行了分析,一起来看一下吧。数...