5分钟带你了解Python中的容器型数据类型--列表3

列表推导与嵌套:简化数据处理的艺术
本文介绍了列表推导式和嵌套的高效用法,通过实例展示如何快速创建和操作二维表格数据,如成绩统计和数据筛选。列表推导的简洁语法让你轻松处理复杂数据,而列表嵌套则用于存储和组织多维度信息。

列表推导式和列表的嵌套

1.列表推导式(列表生成式)

定义一个列表,共有三种方法

1.字面量语法

比如:

names = []                            # 构造一个空列表
names = ['刘备', '关羽', '张飞','曹操', '吕布']       

2.构造器语法

items1 = list(range(1, 10))
print(items1)    # [1, 2, 3, 4, 5, 6, 7, 8, 9]
items2 = list('hello')
print(items2)    # ['h', 'e', 'l', 'l', 'o']

3.生成式语法(特殊的字面量语法)

这里用到的方式叫做列表生成式,也叫作列表推导式。

首先,我们先看看用之前的字面量语法创建一个装有1-100的整数的列表

nums = []
for num in range(1,101):
    nums.append(num)
print(nums)

然后,我们看看用生成式创建同样的列表

nums = [num for num in range(1,101) ]
print(nums)

对比一下,第一种闲的不仅lower,而且太过麻烦

而列表生成式也是非常好理解的

它的语法

列表名 = [要添加进来的元素 循环(没有冒号 :)]

现在再看上面的例子,是不是惊呆了,还可以这样方便

循环后面一定没有 冒号

并且循环那里是加判断语句或者是可以多重循环的,例如

判断语句

# 创建一个由'hello world'中除空格和元音字母外的字符构成的列表
words = [word for word in 'hello world' if word not in ' aioeu']
print(words)             # ['h', 'l', 'l', 'w', 'r', 'l', 'd']

列表中双重for循环

# 创建一个由个两个字符串中字符的笛卡尔积构成的列表
items = [x + y for x in 'ABC' for y in '12']
print(items)    # ['A1', 'A2', 'B1', 'B2', 'C1', 'C2']

赶紧自己试试,下面,我们来看列表的嵌套

2.列表的嵌套(知识点补充)

顾名思义,列表的嵌套就是一个列表中,外层是一个列表,里面的元素又是列表,那这样我们就将它叫做列表的嵌套,那它这样做有什么用呢?是为了装X吗?看完下面的例子,你就明白了,首先看看它应该是这样的一个样子:

scores = [[92, 86, 68, 54, 73], [74, 80, 91, 79, 89], [73, 80, 80, 82, 76]]

可能这样看你还不能发现什么觉得它有用的地方,那这样呢?

scores = [[92, 86, 68, 54, 73],
         [74, 80, 91, 79, 89], 
         [73, 80, 80, 82, 76]]

是不是和我们日常操作的表格二维表很像呢?一个三行五列的表格,没错,可能你也想到了,比如你想存储数据,完全就可以借用这样一个“表格”来帮你进行存储,而且不只是存储,当你想处理里面的数据的时候,同样可以对他们进行操作。

例如:保存5个学生,3门课程的成绩,那就是上面那样保存

scores = [[65, 88, 64], [68, 61, 64], [59, 97, 94], [57, 71, 79], [63, 61, 85]]
names = ['刘备', '关羽', '张飞','曹操', '吕布']
courses = ['语文', '数学', '英语']

例如要对数据进行操作:

1.显示学生的名字和分数

for i, name in enumerate(names):
    for j, course in enumerate(courses):
        print(f"{name}{course}成绩为{scores[i][j]}分")

2.统计每个学生的平均成绩

# 统计每个学生的平均成绩
for i, name in enumerate(names):
    print(f"{name}的平均成绩为{sum(scores[i])/len(courses)}分")

3.找到统计每一门课程的最高分和最低分

for j, course in enumerate(courses):
    temp = [scores[i][j] for i,score in enumerate(scores)]  # 将每一门课程成绩放到临时变量中
    print(f"{course}的最高分是{max(temp)}")
    print(f"{course}的最低分是{min(temp)}")

怎么样,是不是挺有意思呢?

如果对你有帮助,不要帮助点赞、评论、关注加收藏哦!

<think>好的,我现在需要帮助用户了解Python中collections模块的用法,特别是其提供的容器数据类型的使用方法。首先,我要回忆一下用户之前的问题和我的回答,确保信息的一致性。用户之前询问了关于calendar模块的使用,现在转向了collections模块,这属于Python标准库中的另一个重要部分。 首先,我需要确定用户的需求。用户明确提到想了解collections模块的容器数据类型,所以需要重点介绍该模块中的各个类,比如namedtuple、deque、Counter、defaultdict、OrderedDict等。同时,用户提供的引用中提到了OrderedDict在实现LRU缓存中的应用,以及collections模块相比内置数据类型的优势,比如顺序保持和高性能,这些都需要在回答中强调。 接下来,我应该参考用户提供的引用内容。引用1提到collections模块提供了额外的高性能数据类型,比如OrderedDict,这补充了内置字典的无序性。引用3详细列出了collections中的几个重要类,并提到需要导入这些类。引用4展示了使用OrderedDict实现LRU缓存的例子。引用2虽然关于array模块,但用户当前的问题不涉及,可以忽略。 接下来,我需要组织回答的结构。通常,用户指南应包括模块概述、核心类详解、实用场景示例、最佳实践和常见问题解答。这样结构清晰,便于用户逐步理解和应用。 模块概述部分需要简要说明collections模块的作用,强调其扩展了内置数据类型,提供了更高效和专用的容器。例如,可以提到namedtuple用于创建有名字段的元组,deque用于高效的双端队列操作,Counter用于计数等。 在核心类详解部分,每个类需要分点说明,包括功能、创建方式、常用方法和示例代码。例如,namedtuple可以举例如何定义一个有名字的元组,并访问其字段;Counter可以展示如何统计元素出现次数。 实用场景示例部分应结合具体案例,如使用defaultdict处理缺失键,用OrderedDict实现LRU缓存,用Counter统计词频等。这些示例能帮助用户理解如何在实际项目中应用这些容器。 最佳实践部分需要给出使用建议,比如何时选择collections中的类而不是内置类,如何提高代码效率和可读性。例如,在需要维护插入顺序时使用OrderedDict,或者处理大量计数时使用Counter。 常见问题解答部分应解答用户可能遇到的疑问,比如线程安全、性能比较、与内置类的区别等。例如,解释deque的线程安全性,或者为什么在某些情况下defaultdict比普通dict更方便。 同时,需要确保回答中正确引用用户提供的引用内容。例如,在讨论OrderedDict时引用[^4]中的LRU缓存实现,在提到高性能数据类型时引用[^1]和[^3]的内容。 另外,用户之前的对话中关于calendar模块的回答结构可以作为参考,保持一致性。比如使用代码示例、分段说明、注意事项等,使内容易于理解和跟随。 需要注意用户可能对某些概念不太熟悉,比如“命名元组”或“双端队列”,需要用简洁的语言解释,并提供直观的例子。例如,解释namedtuple时,可以对比普通元组,说明其通过名称访问字段的优势。 最后,确保回答符合用户的要求:结构清晰、真实可靠,并包含相关问题。例如,在最后生成相关问题,帮助用户进一步探索collections模块的其他功能或高级用法。 总结来说,我需要系统地介绍collections模块中的各个容器,结合示例和实际应用场景,引用用户提供的资料,并保持回答的结构化和易读性。同时,注意使用中文,避免技术术语过于晦涩,确保用户能够轻松理解和应用所学内容。</think>### Python collections模块容器数据类型使用指南 --- #### 一、模块概述 `collections` 模块是 Python 标准库中**增强容器数据类型**的核心模块,提供比内置类更高效的专用容器。其核心价值体现在: - 扩展内置容器的功能(如有序字典、命名元组) - 提供高性能数据结构(如双端队列`deque`) - 简化复杂数据处理逻辑(如计数器`Counter`、默认字典`defaultdict`) [^3] --- #### 二、核心容器详解 ##### 1. `namedtuple`:命名字段的元组 ```python from collections import namedtuple # 定义坐标点类(字段名用空格分隔) Point = namedtuple(&#39;Point&#39;, [&#39;x&#39;, &#39;y&#39;]) p = Point(11, y=22) print(p.x + p.y) # 输出: 33 print(p[0] + p[1]) # 输出: 33 (仍支持索引访问) ``` - **优势**:增强代码可读性,替代索引访问的元组 - **典场景**:数据库查询结果、多维坐标 ##### 2. `deque`:高效双端队列 ```python from collections import deque d = deque([1, 2, 3]) d.appendleft(0) # 左端插入 d.append(4) # 右端插入 print(d) # 输出: deque([0, 1, 2, 3, 4]) d.pop() # 移除右端元素 d.popleft() # 移除左端元素 print(d) # 输出: deque([1, 2, 3]) ``` - **性能**:左右插入/删除时间复杂度 $O(1)$ - **独特功能**:`maxlen`参数限制队列长度(自动丢弃旧数据) ##### 3. `Counter`:元素计数器 ```python from collections import Counter words = [&#39;apple&#39;, &#39;banana&#39;, &#39;apple&#39;, &#39;orange&#39;, &#39;banana&#39;, &#39;apple&#39;] word_counts = Counter(words) print(word_counts.most_common(2)) # 输出: [(&#39;apple&#39;, 3), (&#39;banana&#39;, 2)] ``` - **核心方法**: - `elements()`:生成所有元素迭代器 - `subtract()`:元素计数减法操作 - `update()`:合并计数器 ##### 4. `defaultdict`:默认值字典 ```python from collections import defaultdict # 自动为不存在的键创建空列表 dd = defaultdict(list) dd[&#39;fruits&#39;].append(&#39;apple&#39;) dd[&#39;fruits&#39;].append(&#39;banana&#39;) print(dd[&#39;vegetables&#39;]) # 输出: [] (自动创建空列表) ``` - **工厂函数**:支持`int`、`set`、`lambda`表达式等初始化方式 - **对比普通字典**:避免`KeyError`异常,简化代码逻辑 ##### 5. `OrderedDict`:有序字典 ```python from collections import OrderedDict od = OrderedDict() od[&#39;a&#39;] = 1 od[&#39;b&#39;] = 2 od[&#39;c&#39;] = 3 print(list(od.keys())) # 输出: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;] (保留插入顺序)[^4] # 实现LRU缓存(最近最少使用) class LRUCache(OrderedDict): def __init__(self, capacity): self.capacity = capacity def get(self, key): if key not in self: return -1 self.move_to_end(key) return self[key] def put(self, key, value): if key in self: self.move_to_end(key) self[key] = value if len(self) > self.capacity: self.popitem(last=False) ``` - **特性**:记录键的插入顺序(Python 3.7+ 普通`dict`已支持有序,但此类提供额外方法) - **特殊方法**:`move_to_end()`、`popitem(last=True)` --- #### 三、实用场景示例 ##### 1. 统计文本词频 ```python from collections import Counter import re text = "Python is powerful. Python is easy to learn. Python is open source." words = re.findall(r&#39;\w+&#39;, text.lower()) word_counter = Counter(words) print(word_counter.most_common(3)) # 输出: [(&#39;python&#39;, 3), (&#39;is&#39;, 3), (&#39;powerful&#39;, 1)] ``` ##### 2. 高效实现滑动窗口 ```python from collections import deque def sliding_window_max(nums, k): q = deque() result = [] for i, num in enumerate(nums): while q and nums[q[-1]] <= num: q.pop() q.append(i) if q[0] == i - k: q.popleft() if i >= k - 1: result.append(nums[q[0]]) return result print(sliding_window_max([1,3,-1,-3,5,3,6,7], 3)) # 输出: [3,3,5,5,6,7] ``` ##### 3. 多层嵌套字典自动创建 ```python from collections import defaultdict def nested_defaultdict(): return defaultdict(nested_defaultdict) data = nested_defaultdict() data[&#39;user&#39;][&#39;profile&#39;][&#39;name&#39;] = &#39;Alice&#39; print(data[&#39;user&#39;][&#39;profile&#39;][&#39;age&#39;]) # 自动创建空字典,无KeyError ``` --- #### 四、最佳实践建议 1. **类选择指南**: - 需要**快速插入/删除** → `deque` - 处理**缺失键** → `defaultdict` - **元素计数** → `Counter` - 需要**字段名称**的元组 → `namedtuple` 2. **内存优化技巧**: - 使用`__slots__`优化`namedtuple`内存占用 ```python class Point(namedtuple(&#39;Point&#39;, [&#39;x&#39;, &#39;y&#39;])): __slots__ = () ``` 3. **线程安全注意**: - `deque`的`append()`/`popleft()`是**原子操作**,适合多线程生产者-消费者模式 --- #### 五、常见问题解答 1. **`OrderedDict`与普通字典的区别?** - Python 3.7+ 普通字典已记录插入顺序,但`OrderedDict`提供: - 顺序比较功能(`od1 == od2`会检查顺序) - `move_to_end()`等顺序操作方法 - 更高效的反向迭代(通过`reversed()`) 2. **`defaultdict`的性能损耗?** - 与普通字典相比几乎无额外开销,工厂函数在C语言层实现 3. **何时使用`ChainMap`?** - 合并多个字典时优先查找效率高,适合配置层级管理: ```python from collections import ChainMap defaults = {&#39;color&#39;: &#39;red&#39;, &#39;size&#39;: &#39;M&#39;} user_settings = {&#39;size&#39;: &#39;L&#39;} combined = ChainMap(user_settings, defaults) print(combined[&#39;color&#39;]) # 输出: red ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python和数据分析

钟意作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值