0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python列表去重的4種方式

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-11-02 10:46 ? 次閱讀

列表去重是Python中一種常見的處理方式,任何編程場景都可能會遇到需要列表去重的情況。

列表去重的方式有很多,本文將一一講解他們,并進行性能的對比。

讓我們先制造一些簡單的數(shù)據(jù),生成0到99的100萬個隨機數(shù):

from random import randrange
DUPLICATES = [randrange(100) for _ in range(1000000)]

接下來嘗試這4種去重方式中最簡單直觀的方法:

1.新建一個數(shù)組,遍歷原數(shù)組,如果值不在新數(shù)組里便加入到新數(shù)組中。

# 第一種方式
def easy_way():
    unique = []
    for element in DUPLICATES:
        if element not in unique:
            unique.append(element)
    return unique

進入ipython使用timeit計算其去重耗時:

%timeit easy_way()
# 1.16 s ± 137 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

圖片

平均耗時在1.16秒左右,但是在這個例子中我們使用了數(shù)組作為存儲對象,實際上如果我們改成集合存儲去重后的結(jié)果,性能會快不少:

def easy_way():
    unique = set()
    for element in DUPLICATES:
        if element not in unique:
            unique.add(element)
    return unique
%timeit easy_way()
# 48.4 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

平均耗時在48毫秒左右,改善明顯,這是因為集合和數(shù)組的內(nèi)在數(shù)據(jù)結(jié)構(gòu)完全不同,集合使用了哈希表,因此速度會比列表快許多,但缺點在于無序。

接下來看看第2種方式:

2.直接對數(shù)組進行集合轉(zhuǎn)化,然后再轉(zhuǎn)回數(shù)組:

# 第二種去重方式
def fast_way()
    return list(set(DUPLICATES))

耗時:

%timeit fast_way()
# 14.2 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

平均耗時14毫秒,這種去重方式是最快的,但正如前面所說,集合是無序的,將數(shù)組轉(zhuǎn)為集合后再轉(zhuǎn)為列表,就失去了原有列表的順序。

如果現(xiàn)在有保留原數(shù)組順序的需要,那么這個方式是不可取的,怎么辦呢?

3.保留原有數(shù)組順序的去重

使用dict.fromkeys()函數(shù),可以保留原有數(shù)組的順序并去重:

def save_order():
    return list(dict.fromkeys(DUPLICATES))

當(dāng)然,它會比單純用集合進行去重的方式耗時稍微久一點:

%timeit save_order()
# 39.5 ms ± 8.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

平均耗時在39.5毫秒,我認(rèn)為這是可以接受的耗時,畢竟保留了原數(shù)組的順序。

但是,dict.fromkeys()僅在Python3.6及以上才支持。

如果你是Python3.6以下的版本,那么可能要考慮第四種方式了。

4. Python3.6以下的列表保留順序去重

在Python3.6以下,其實也存在fromkeys函數(shù),只不過它由collections提供:

from collections import OrderedDict
def save_order_below_py36():
    return list(OrderedDict.fromkeys(DUPLICATES))

耗時:

%timeit save_order_below_py36()
# 71.8 ms ± 16.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

平均耗時在72毫秒左右,比 Python3.6 的內(nèi)置dict.fromkeys()慢一些,因為OrderedDict是用純Python實現(xiàn)的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • 存儲
    +關(guān)注

    關(guān)注

    13

    文章

    4226

    瀏覽量

    85575
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    412

    瀏覽量

    25881
收藏 人收藏

    評論

    相關(guān)推薦

    python連接列表方式

    , 2, 3, 4, 5, 6]5、使用列表推導(dǎo)式Python 里對于生成列表、集合、字典,有一套非常 Pythonnic 的寫法。那就是列表
    發(fā)表于 04-07 17:04

    Python 編程常用的12基礎(chǔ)知識匯總

    Python 編程中常用的12 基礎(chǔ)知識總結(jié):正則表達式替換,遍歷目錄方法,列表按列排序、,字典排序,字典、
    發(fā)表于 11-15 14:11 ?520次閱讀
    <b class='flag-5'>Python</b> 編程常用的12<b class='flag-5'>種</b>基礎(chǔ)知識匯總

    小猿圈python學(xué)習(xí)之Python列表list合并的4方法

    Python作為目前市面上最常用的編程語言之一,贏得了我們很多技術(shù)人員的喜愛,同時越來越多的人紛紛開始學(xué)習(xí)python,今天小猿圈就給大家分享在python3中合并列表
    發(fā)表于 05-16 21:37 ?1592次閱讀

    使用Python實現(xiàn)對excel文檔及求和的方法和代碼說明

    近期有不少小伙伴在觀看咱們扣丁學(xué)堂的Python 視頻直播課程,在課程結(jié)束后有不少的小伙伴詢問老師一些問題, 今天小編給大家整理一下學(xué)員的問題: Python 對excel 文檔
    發(fā)表于 10-10 17:36 ?14次下載
    使用<b class='flag-5'>Python</b>實現(xiàn)對excel文檔<b class='flag-5'>去</b><b class='flag-5'>重</b>及求和的方法和代碼說明

    如何運用Python列表的元素比較解決問題

    在用python處理多個列表元素時,需要處理的信息一般比較多且雜。這時運用Python列表元素比較的方法,就能快速處理列表信息,能更輕松訪問
    的頭像 發(fā)表于 02-17 15:04 ?703次閱讀
    如何運用<b class='flag-5'>Python</b><b class='flag-5'>列表</b>的元素比較解決問題

    python列表序列操作教程

    python列表也是序列對象,可以進行序列通用的操作,類似字符串序列的操作。
    的頭像 發(fā)表于 02-23 15:04 ?609次閱讀

    介紹python列表的邊界和嵌套

    本文介紹python列表的邊界和嵌套。只能訪問python列表范圍內(nèi)的項,python列表可以嵌
    的頭像 發(fā)表于 02-27 14:49 ?901次閱讀

    python列表特定方法有哪些

    python列表類似其他語言的數(shù)組,但是python列表的元素(項)可以同時為不同類型的對象,即沒有固定類型約束。
    的頭像 發(fā)表于 02-27 14:51 ?464次閱讀

    Python列表的基本概念、常用操作及實際應(yīng)用

    Python列表是一強大的數(shù)據(jù)結(jié)構(gòu),用于在程序中存儲和操作一系列的值。列表是可變的(mutable),可以動態(tài)地增加、刪除和修改其中的元素。在Py
    的頭像 發(fā)表于 04-16 10:42 ?1626次閱讀

    Python字典組成的數(shù)組怎么進行

    你知道嗎?如果數(shù)組是字典組成的,直接對數(shù)組內(nèi)的字典采用set的方式進行,會報錯: test = [{ "a" : 1}, { "a" : 1}, { "a" : 3}, { "b" : 4
    的頭像 發(fā)表于 10-17 11:26 ?438次閱讀

    Python調(diào)用JS的 4 方式

    Python 實現(xiàn) 本文將聊聊利用 Python 調(diào)用 JS 的4方式 2. 準(zhǔn)備 以一段簡單的 JS 腳本為例,將代碼寫入到文件中
    的頭像 發(fā)表于 10-30 09:41 ?663次閱讀

    Python 字典組成的數(shù)組怎么進行

    你知道嗎?如果數(shù)組是字典組成的,直接對數(shù)組內(nèi)的字典采用set的方式進行,會報錯: test = [{ "a" : 1}, { "a" : 1}, { "a" : 3}, { "b" : 4
    的頭像 發(fā)表于 11-01 10:55 ?439次閱讀

    python列表和數(shù)組的區(qū)別

    內(nèi)部實現(xiàn)、性能、操作方式等多個方面進行詳細(xì)分析,以幫助讀者更好地理解它們之間的區(qū)別和適用場景。 一、內(nèi)部實現(xiàn): 列表(List): Python中的列表是一
    的頭像 發(fā)表于 11-21 15:13 ?2207次閱讀

    python怎樣讓列表里的數(shù)相加

    Python是一功能強大的編程語言,可以用于處理各種各樣的數(shù)學(xué)運算和數(shù)據(jù)操作。在Python中,我們可以使用簡單的代碼將列表中的數(shù)字相加。 首先,我們需要創(chuàng)建一個包含數(shù)字的
    的頭像 發(fā)表于 11-22 09:53 ?1777次閱讀

    python如何遍歷列表并提取

    是一有序的可變集合,可以容納任意類型的元素。在Python中,列表用方括號[ ]表示,其中的元素可以通過索引進行訪問。索引是從0開始,表示列表中元素的位置。 在遍歷
    的頭像 發(fā)表于 11-23 15:55 ?1242次閱讀