python中deque类详解,deque 遍历

发布时间:2022-11-19

本文目录一览:

  1. python3什么是deque容器
  2. Python中的collections模块详解
  3. Python中冷门但非常好用的内置函数
  4. python deque是列表吗
  5. python3中如何用deque判断队列是否为空
  6. deque是一种什么数据类型

python3什么是deque容器

deque(双端队列)是一种支持向两端高效地插入数据、支持随机访问的容器。 使用方法参考

Python中的collections模块详解

其他关于Python的总结文章请访问: collections 模块给出了 Python 中一些功能更加强大的数据结构、集合类。 顾名思义,namedtuple 就是有了名字的 tuple,声明一个 namedtuple 类的时候可以传入两个参数,第一个是这个 tuple 的名字,第二个是一个 str 的列表,依次说明其中每一个元素的名称: 运行结果: 再比如,使用一个 namedtuple 来存储一个马尔可夫决策过程(Markov Decision Process,MDP)模型: deque 是一个双向列表,非常适用于队列和栈。因为普通的 list 是一个线性结构,使用索引访问元素时非常快,但是对于插入和删除就比较慢。所以 deque 可以提高插入和删除的效率,可以使用 list(a_deque)deque 转换成 list。 常用的方法: 一个例子: 运行结果: defaultdict 是给不存在的 key 分配一个默认值的字典。和普通的 dict 相比,如果遇到 key 不存在的情况,不会抛出 KeyError,而是返回默认值。其他的行为和 dict 一模一样: 运行结果为: 正如其名字所说,OrderedDict 是一个有序的字典。普通的 dict 中的 key 是没有顺序的,即我们遍历一个字典的时候是不知道它所遍历的顺序的。单独 OrderedDictkey 进行了排序,顺序就是插入键的顺序,后插入的排在后边,这样在遍历的时候就有了顺序: 运行结果为: ChainMap 是一个将多个 dict 按照顺序串起来的数据结构。在查找字典中的某一个键所对应的值的时候,先从 ChainMap 中的第一个字典查起,如果该字典有该 key,就返回对应的值,没有就依次往后查找后面的 dict。 获得的结果为: Counter 是一个计数器,它是 dict 的一个子类,可以根据键来区别记录多个不同的计数,相当于一个计数器集合,还可以通过 update 函数一次性更新多个计数器: 得到的结果:

Python中冷门但非常好用的内置函数

Python中有许多内置函数,不像 printlen 那么广为人知,但它们的功能却异常强大,用好了可以大大提高代码效率,同时提升代码的简洁度,增强可阅读性。

Counter

collections 在 Python 官方文档中的解释是 High-performance container datatypes,直接的中文翻译解释为高性能容量数据类型。这个模块实现了特定目标的容器,以提供 Python 标准内建容器 dictlistsettuple 的替代选择。在 Python 3.10.1 中它总共包含以下几种数据类型:

容器名 简介
namedtuple() 创建命名元组子类的工厂函数
deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面
Counter 字典的子类,提供了可哈希对象的计数功能
OrderedDict 字典的子类,保存了它们被添加的顺序
defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict 封装了字典对象,简化了字典子类化
UserList 封装了列表对象,简化了列表子类化
UserString 封装了字符串对象,简化了字符串子类化
其中 Counter 中文意思是计数器,也就是我们常用于统计的一种数据类型,在使用 Counter 之后可以让我们的代码更加简单易读。Counter 类继承 dict 类,所以它能使用 dict 类里面的方法。
举例:
# 统计词频
fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']
result = {}
for fruit in fruits:
    if not result.get(fruit):
        result[fruit] = 1
    else:
        result[fruit] += 1
print(result)
# {'apple': 2, 'peach': 3, 'lemon': 1}
# 使用 Counter 实现
from collections import Counter
fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']
c = Counter(fruits)
print(dict(c))
# {'apple': 2, 'peach': 3, 'lemon': 1}

elements()

返回一个迭代器,其中每个元素将重复出现计数值所指定次。元素会按首次出现的顺序返回。如果一个元素的计数值小于 1,elements() 将会忽略它。

c = Counter(a=4, b=2, c=0, d=-2)
sorted(c.elements())
# ['a', 'a', 'a', 'a', 'b', 'b']

most_common([n])

返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序。如果 n 被省略或为 Nonemost_common() 将返回计数器中的所有元素。计数值相等的元素按首次出现的顺序排序:

Counter('abracadabra').most_common(3)
# [('a', 5), ('b', 2), ('r', 2)]

这两个方法是 Counter 中最常用的方法,其他方法可以参考 Python 3.10.1 官方文档。

实战

Leetcode 1002. 查找共用字符 给你一个字符串数组 words,请你找出所有在 words 的每个字符串中都出现的共用字符(包括重复字符),并以数组形式返回。你可以按任意顺序返回答案。 示例: 输入:words = ["bella", "label", "roller"]
输出:["e", "l", "l"]
输入:words = ["cool", "lock", "cook"]
输出:["c", "o"]
看到统计字符,典型的可以用 Counter 完美解决。这道题是找出字符串列表里面每个元素都包含的字符,首先可以用 Counter 计算出每个元素每个字符出现的次数,依次取交集最后得出所有元素共同存在的字符,然后利用 elements 输出共用字符出现的次数。

class Solution:
    def commonChars(self, words: List[str]) -> List[str]:
        from collections import Counter
        ans = Counter(words[0])
        for i in words[1:]:
            ans &= Counter(i)
        return list(ans.elements())

提交一下,发现 83 个测试用例耗时 48ms,速度还是不错的。

sorted

在处理数据过程中,我们经常会用到排序操作,比如将列表、字典、元组里面的元素正/倒排序。这时候就需要用到 sorted(),它可以对任何可迭代对象进行排序,并返回列表。 对列表升序操作:

a = sorted([2, 4, 3, 7, 1, 9])
print(a)
# 输出:[1, 2, 3, 4, 7, 9]

对元组倒序操作:

sorted((4,1,9,6), reverse=True)
# 输出:[9, 6, 4, 1]

使用参数 key,根据自定义规则,按字符串长度来排序:

fruits = ['apple', 'watermelon', 'pear', 'banana']
a = sorted(fruits, key=lambda x: len(x))
print(a)
# 输出:['pear', 'apple', 'banana', 'watermelon']

all

all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 True,如果是返回 True,否则返回 False。元素除了是 0、空、NoneFalse 外都算 True。注意:空元组、空列表返回值为 True

all(['a', 'b', 'c', 'd'])  # 列表 list,元素都不为空或 0
# True
all(['a', 'b', '', 'd'])  # 列表 list,存在一个为空的元素
# False
all([0, 1, 2, 3])  # 列表 list,存在一个为 0 的元素
# False
all(('a', 'b', 'c', 'd'))  # 元组 tuple,元素都不为空或 0
# True
all(('a', 'b', '', 'd'))  # 元组 tuple,存在一个为空的元素
# False
all((0, 1, 2, 3))  # 元组 tuple,存在一个为 0 的元素
# False
all([])  # 空列表
# True
all(())  # 空元组
# True

any 函数正好和 all 函数相反:判断一个 tuple 或者 list 是否全为空、0、False。如果全为空、0、False,则返回 False;如果不全为空,则返回 True

F-strings

在 Python 3.6.2 版本中,PEP 498 提出一种新型字符串格式化机制,被称为“字符串插值”或者更常见的一种称呼是 F-strings。F-strings 提供了一种明确且方便的方式将 Python 表达式嵌入到字符串中来进行格式化:

s1 = 'Hello'
s2 = 'World'
print(f'{s1} {s2}!')
# Hello World!
def power(x):
    return x * x
x = 4
print(f'{x} * {x} = {power(x)}')
# 4 * 4 = 16

而且 F-strings 的运行速度很快,比传统的 %-string 和 str.format() 这两种格式化方法都快得多,书写起来也更加简单。 本文主要讲解了 Python 几种冷门但好用的函数,更多内容以后会陆陆续续更新~

python deque是列表吗

列表是 listdeque 是一种双端队列,一般是限定插入和删除操作在表的两端进行的线性表。 可以在两头插入和弹出元素,和 list 很类似,不过一般用于多线程中。

python3中如何用deque判断队列是否为空

假设 deque 变量是 d,可以直接用 if else 判断。

if d:
    # 队列不为空
else:
    # 队列为空

因为 Python 的 if 会把表达式转化为 bool 值,队列不为 None 并且长度不是零的时候表达式的值为 True,否则为 False。同理的还有其他 ListDict 类型等。

deque是一种什么数据类型

std::deque 简单说明:std::deque 是一个高效的双端队列,可以高效地进行插入和删除操作。 以 SGI C++ STL 为例: deque 的基本结构是:有一个 mapmap 中的元素是一个记录了一个大小为 512 字节的线性容器。

std::deque 的构造方法:

std::deque<int> queInt; // 空队列
std::deque<int> queInt(10); // 长度为 10 的队列(其中元素被初始化为该类型的 0 值)
std::deque<int> queInt(10, 5); // 长度为 10 的队列(其中元素被初始化为该类型的 5)
std::deque<int> queIntTemp(10, 5); // 长度为 10 的队列(其中元素被初始化为该类型的 5)
std::deque<int> queInt(queIntTemp); // 以 queIntTemp 初始化 queInt
int nArray[] = {1, 2, 3, 4, 5};
std::deque<int> queInt(nArray, nArray + 5); // 注意这里是 nArray + 5,而不是 nArray + 4

插入数据的方法:

  • push_back:末尾插入
  • push_front:前端插入

删除方法:

  • pop_front
  • pop_back
  • erase
  • clear