最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的deque基本用法詳解

 更新時(shí)間:2024年04月30日 11:17:17   作者:AI浩  
Python?中的?deque是一個(gè)低級(jí)別的、高度優(yōu)化的雙端隊(duì)列,對(duì)于實(shí)現(xiàn)優(yōu)雅、高效的Pythonic隊(duì)列和堆棧很有用,這篇文章主要介紹了python中的deque基本用法的相關(guān)資料,需要的朋友可以參考下

摘要

deque(雙端隊(duì)列)是Python標(biāo)準(zhǔn)庫(kù)collections模塊中的一個(gè)類,它支持從兩端快速添加和刪除元素。deque為固定大小或者可變大小的隊(duì)列提供了線程安全的實(shí)現(xiàn),并且它比使用列表(list)來(lái)實(shí)現(xiàn)相同的功能更為高效

deque的主要特點(diǎn)和操作包括:

  • 快速?gòu)膬啥颂砑雍蛣h除元素deque在兩端添加和刪除元素的時(shí)間復(fù)雜度都是O(1),而列表在列表頭部添加或刪除元素的時(shí)間復(fù)雜度是O(n)。
  • 線程安全deque的實(shí)例可以在多線程環(huán)境中安全使用,而不需要額外的鎖定。
  • 可選的最大長(zhǎng)度:可以通過(guò)maxlen參數(shù)來(lái)限制deque的最大長(zhǎng)度。當(dāng)deque已滿時(shí),添加新元素會(huì)導(dǎo)致最早添加的元素被自動(dòng)移除。

下面是deque的一些詳細(xì)示例:

示例1:基本使用

from collections import deque

# 創(chuàng)建一個(gè)空的deque
d = deque()

# 從右側(cè)添加元素
d.append('a')
d.append('b')
print(d)  # 輸出:deque(['a', 'b'])

# 從左側(cè)添加元素
d.appendleft('c')
print(d)  # 輸出:deque(['c', 'a', 'b'])

# 從右側(cè)移除元素
right_item = d.pop()
print(right_item)  # 輸出:'b'
print(d)  # 輸出:deque(['c', 'a'])

# 從左側(cè)移除元素
left_item = d.popleft()
print(left_item)  # 輸出:'c'
print(d)  # 輸出:deque(['a'])

示例2:使用maxlen限制隊(duì)列長(zhǎng)度

from collections import deque

# 創(chuàng)建一個(gè)最大長(zhǎng)度為3的deque
d = deque(maxlen=3)

# 添加元素
d.append('a')
d.append('b')
d.append('c')
print(d)  # 輸出:deque(['a', 'b', 'c'], maxlen=3)

# 繼續(xù)添加元素,最早添加的元素'a'將被移除
d.append('d')
print(d)  # 輸出:deque(['b', 'c', 'd'], maxlen=3)

# 嘗試從左側(cè)添加元素,同樣會(huì)移除最早添加的元素
d.appendleft('e')
print(d)  # 輸出:deque(['e', 'c', 'd'], maxlen=3)

示例3:使用deque實(shí)現(xiàn)滑動(dòng)窗口算法

滑動(dòng)窗口算法常用于數(shù)組或列表的子序列問(wèn)題,如尋找最大/最小子序列和。

from collections import deque

def max_sliding_window(nums, k):
    # 使用deque保存窗口中的最大值索引
    window = deque()
    result = []

    for i in range(len(nums)):
        # 如果deque不為空且當(dāng)前元素大于deque尾部元素對(duì)應(yīng)的值,則移除尾部元素
        while window and nums[window[-1]] <= nums[i]:
            window.pop()
        # 添加當(dāng)前元素的索引到deque
        window.append(i)
        # 當(dāng)窗口大小達(dá)到k時(shí),開(kāi)始記錄窗口內(nèi)的最大值,并嘗試移動(dòng)窗口左邊界
        if i >= k - 1:
            result.append(nums[window[0]])  # window[0]是當(dāng)前窗口內(nèi)最大值的索引
            # 如果deque頭部的索引已經(jīng)不在當(dāng)前窗口內(nèi),則移除頭部索引
            if window[0] <= i - k:
                window.popleft()

    return result

nums = [1, 3, -1, -3, 5, 3, 6, 7]
k = 3
print(max_sliding_window(nums, k))  # 輸出:[3, 3, 5, 5, 6, 7]

在這個(gè)例子中,deque用于存儲(chǔ)當(dāng)前窗口內(nèi)元素值的索引,通過(guò)維護(hù)一個(gè)遞減的索引隊(duì)列,我們可以快速找到窗口內(nèi)的最大值。當(dāng)窗口向右滑動(dòng)時(shí),我們更新隊(duì)列并記錄每個(gè)窗口的最大值。

在Python中,collections.deque 是一個(gè)非常實(shí)用的雙向隊(duì)列實(shí)現(xiàn),它可以高效地在隊(duì)列兩端添加或移除元素。以下是一些使用 deque 的示例:

示例 4: 使用 deque 實(shí)現(xiàn)旋轉(zhuǎn)數(shù)組

from collections import deque

def rotate_array(nums, k):
    dq = deque(nums)
    dq.rotate(-k)  # 逆時(shí)針旋轉(zhuǎn) k 位,如果是順時(shí)針旋轉(zhuǎn)則直接寫(xiě) k
    return list(dq)

nums = [1, 2, 3, 4, 5, 6, 7]
k = 3
rotated_nums = rotate_array(nums, k)
print(rotated_nums)  # 輸出: [5, 6, 7, 1, 2, 3, 4]

示例 5: 使用 deque 實(shí)現(xiàn)最大/最小棧

from collections import deque

class MaxStack:
    def __init__(self):
        self.stack = deque()
        self.max_stack = deque()

    def push(self, x):
        self.stack.append(x)
        if not self.max_stack or x >= self.max_stack[-1]:
            self.max_stack.append(x)

    def pop(self):
        if self.stack:
            if self.stack[-1] == self.max_stack[-1]:
                self.max_stack.pop()
            return self.stack.pop()
        return None

    def top(self):
        return self.stack[-1] if self.stack else None

    def getMax(self):
        return self.max_stack[-1] if self.max_stack else None

# 使用示例
max_stack = MaxStack()
max_stack.push(5)
max_stack.push(7)
max_stack.push(1)
max_stack.push(5)
print(max_stack.getMax())  # 輸出: 7
max_stack.pop()
print(max_stack.top())  # 輸出: 5
print(max_stack.getMax())  # 輸出: 7

在這個(gè)例子中,MaxStack 類使用兩個(gè) deque:一個(gè)用于存儲(chǔ)棧的元素,另一個(gè)用于存儲(chǔ)當(dāng)前棧中的最大值。這樣,我們可以在常數(shù)時(shí)間內(nèi)獲取棧頂?shù)淖畲笾?/p>

示例 6: 使用 deque 實(shí)現(xiàn)廣度優(yōu)先搜索(BFS)

在圖的遍歷中,deque 常用于實(shí)現(xiàn)廣度優(yōu)先搜索(BFS)。

from collections import deque

def bfs(graph, root):
    visited = set()
    queue = deque([root])

    while queue:
        vertex = queue.popleft()
        print(vertex, end=" ")

        for neighbour in graph[vertex]:
            if neighbour not in visited:
                visited.add(neighbour)
                queue.append(neighbour)

# 圖的鄰接表表示
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

bfs(graph, 'A')  # 輸出: A B C D E F

在上面的例子中,我們使用 deque 作為隊(duì)列來(lái)存儲(chǔ)待訪問(wèn)的節(jié)點(diǎn),實(shí)現(xiàn)了圖的廣度優(yōu)先搜索。

這些示例展示了 deque 在不同場(chǎng)景下的應(yīng)用,從基本的隊(duì)列操作到更復(fù)雜的算法實(shí)現(xiàn)。deque 的靈活性和高效性使得它成為處理序列數(shù)據(jù)的強(qiáng)大工具。

總結(jié)

到此這篇關(guān)于python中的deque基本用法的文章就介紹到這了,更多相關(guān)python中deque用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)上傳樣本到virustotal并查詢掃描信息的方法

    python實(shí)現(xiàn)上傳樣本到virustotal并查詢掃描信息的方法

    這篇文章主要介紹了python實(shí)現(xiàn)上傳樣本到virustotal并查詢掃描信息的方法,是比較實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • Python的pdfplumber庫(kù)將pdf轉(zhuǎn)為圖片的實(shí)現(xiàn)

    Python的pdfplumber庫(kù)將pdf轉(zhuǎn)為圖片的實(shí)現(xiàn)

    本文主要介紹了Python的pdfplumber庫(kù)將pdf轉(zhuǎn)為圖片的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Python實(shí)現(xiàn)刪除文件中含“指定內(nèi)容”的行示例

    Python實(shí)現(xiàn)刪除文件中含“指定內(nèi)容”的行示例

    這篇文章主要介紹了Python實(shí)現(xiàn)刪除文件中含“指定內(nèi)容”的行功能,涉及Python針對(duì)文件讀取及字符串遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • Python查看已安裝包的版本號(hào)的多種方法

    Python查看已安裝包的版本號(hào)的多種方法

    很多朋友一直使用pip list來(lái)查詢,但如果想知道單個(gè),應(yīng)該怎么使用呢,在Python中,可以使用多種方法來(lái)查看已安裝包的版本號(hào),本文給大家詳細(xì)介紹了Python查看已安裝包的版本號(hào)的多種方法,需要的朋友可以參考下
    2024-02-02
  • 解決PyCharm不運(yùn)行腳本,而是運(yùn)行單元測(cè)試的問(wèn)題

    解決PyCharm不運(yùn)行腳本,而是運(yùn)行單元測(cè)試的問(wèn)題

    今天小編就為大家分享一篇解決PyCharm不運(yùn)行腳本,而是運(yùn)行單元測(cè)試的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python編程中對(duì)super函數(shù)的正確理解和用法解析

    Python編程中對(duì)super函數(shù)的正確理解和用法解析

    可能有人會(huì)想到,Python中既然可以直接通過(guò)父類名調(diào)用父類方法為什么還會(huì)存在super函數(shù)?其實(shí),很多人對(duì)Python中的super函數(shù)的認(rèn)識(shí)存在誤區(qū),本文我們就帶來(lái)在Python編程中對(duì)super函數(shù)的正確理解和用法解析
    2016-07-07
  • django中模板繼承與ModelForm實(shí)例詳解

    django中模板繼承與ModelForm實(shí)例詳解

    ModelForm類是form是組件中Form的一個(gè)子類,所以也是處理表單的,下面這篇文章主要給大家介紹了關(guān)于django中模板繼承與ModelForm的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Pandas缺失值刪除df.dropna()的使用

    Pandas缺失值刪除df.dropna()的使用

    本文主要介紹了Pandas缺失值刪除df.dropna()的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python入門(mén)教程(八)PythonCasting用法

    Python入門(mén)教程(八)PythonCasting用法

    這篇文章主要介紹了Python入門(mén)教程(八)PythonCasting用法,Python是一門(mén)非常強(qiáng)大好用的語(yǔ)言,也有著易上手的特性,本文為入門(mén)教程,需要的朋友可以參考下
    2023-04-04
  • pymysql實(shí)現(xiàn)增刪改查的操作指南(python)

    pymysql實(shí)現(xiàn)增刪改查的操作指南(python)

    python中可以使用pymysql來(lái)MySQL數(shù)據(jù)庫(kù)的連接,并實(shí)現(xiàn)數(shù)據(jù)庫(kù)的各種操作,這篇文章主要給大家介紹了關(guān)于pymsql實(shí)現(xiàn)增刪改查的相關(guān)資料,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

响水县| 达孜县| 三河市| 临邑县| 天镇县| 洞头县| 拉萨市| 高要市| 安陆市| 新蔡县| 临西县| 冕宁县| 即墨市| 神木县| 遂川县| 郓城县| 长垣县| 称多县| 万盛区| 安岳县| 甘洛县| 岢岚县| 那曲县| 勐海县| 华池县| 岫岩| 博兴县| 定兴县| 正镶白旗| 深泽县| 枣强县| 保靖县| 德清县| 雷波县| 鸡西市| 阿克苏市| 宿松县| 嫩江县| 昭苏县| 兴海县| 巧家县|