Python 中的展開列表

一個列表被認為是 Python 編程語言中最靈活的數據結構之一。另一方面,通常稱為列表的二維列表或 2D 列表是列表的對象,其中每個元素本身就是列表。例如:[[19,18,17],[16,15,14],[13,12,11]]。

展開列表是通過取消嵌套列表中保存的每個列表元素,將二維列錶轉換為一維列表的過程,也就是說,將[[9,8,7],[6,5,4],[3,2,1]]轉換為[9,8,7,6,5,4,3,2,1]。

我們可以藉助嵌套的對循環、遞歸、列表推導、核心函數執行展開過程,或者在 Python 中根據嵌套列表的深度和規律性導入庫或包。

在本教程中,我們將研究各種方法,以便使用 Python 編程語言來展開嵌套列表。但是在開始之前,讓我們了解嵌套列表的類型。

我們知道, Python 是一種弱類型的編程語言。因此,我們會遇到兩種類型的列表。這些列表或嵌套列表如下:

  1. 常規列表
  2. 不規則列表

常規列表

列表常規列表中的每個項目都被稱為子列表,從而觀察元素類型的一致性。例如:[[9,8,7],[6,5,4],[3,2,1]]是常規列表,因為[9,8,7],[6,5,4],[3,2,1]是列表類型。

不定期列表

不規則列表中的每一項都被稱為子列表或非列表元素(例如,字元串或整數)。因此,在元素類型方面存在不規則性。例如:[[9,8,7],[6,5],4,3]是不規則的列表,因為[9,8,7]和[6,5]是列表類型,而 4 和 3 是 int 類型。

使用嵌套的對列表列表進行展開以獲得循環的幫助被認為是獲得展開列表的強力方法。我們可以通過從二維列表中選擇每個項目並將其排列在一維列表中來執行此方法。

讓我們考慮下面的例子,它既適用於規則列表,也適用於不規則列表。

示例:


# defining the function
def flattenlist(_2dlist):
    # defining an empty list
    flatlist = []
    # Iterating through the outer list
    for item in _2dlist:
        if type(item) is list:
            # If the item is of the list type, iterating through the sub-list
            for element in item:
                flatlist.append(element)
        else:
            flatlist.append(item)
    return flatlist

# defining the nested list
nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]]
print('Genuine List:', nestedlist)
print('Converted Flat List:', flattenlist(nestedlist))

輸出:

Genuine List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]]
Converted Flat List: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

說明:

在上面的例子中,我們定義了一個函數為flanlist,它接受一個參數為 _2dlist 。然後,我們使用循環來迭代嵌套列表的元素,並將它們追加以生成一個扁平列表。然後,我們定義了嵌套列表並實現了flat list函數。因此,嵌套列表已成功轉換為展開列表。

**### 使用列表推導展開嵌套列表

在列表推導的幫助下展開列表被認為是一種根據二維現有列表獲得展開列表的優雅方法。然而,這種方法提供了一種不太直觀的解決方案。

讓我們考慮下面的例子。

示例:


# defining the nested list
nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]]
# list comprehension
flatlist = [element for sub_list in nestedlist for element in sub_list]
print('Genuine list:', nestedlist)
print('Converted list:', flatlist)

輸出:

Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]]
Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90]

說明:

在上面的例子中,我們定義了嵌套列表和列表推導。然後,我們為用戶列印了它們。因此,嵌套列表已成功轉換為展開列表。

我們也可以使用遞歸方法來展開二維列表。讓我們考慮以下實現遞歸方法的示例,以便展開列表列表。這種實現適用於常規和非常規列表。

示例:


# defining a function
def flattenlist(nestedlist):
    if len(nestedlist) == 0:
        return nestedlist
    if isinstance(nestedlist[0], list):
        return flattenlist(nestedlist[0]) + flattenlist(nestedlist[1:])
    return nestedlist[:1] + flattenlist(nestedlist[1:])

print(flattenlist([[10, 20, 30, 40], [50, 60, 70], [80, 90], 100]))

輸出:

[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

說明:

在上面的例子中,我們定義了一個函數,並使用了if語句來聲明嵌套列表的長度是否等於零,然後返回嵌套列表。

**如果第零個索引上的數據元素是列表的一個實例,那麼列表索引將再次進入函數,並添加到列表的下一個索引中,以此類推。否則函數將返回元素等等。最後,我們定義了嵌套列表並執行了函數。結果,列表列表遞歸地變平了。

我們還可以利用一些 Python 編程語言庫來展開列表。這些庫的實現描述如下:

使用功能工具和操作員庫展開列表列表

運算符庫提供了 iconcat() 函數來執行基本操作,如連接。我們可以將此函數從左到右累積應用於嵌套列表的數據元素,從而將嵌套列表簡化為扁平列表。

讓我們考慮下面的例子來理解它的實現。

示例:


# importing the required libraries
import operator
import functools
regularlist = []

# Converting the list of lists into a flattened one.
def convo(nestedlist):
    for element in nestedlist:
        if type(element) is list:
            regularlist.append(element)
        else:
            regularlist.append([element])
    return regularlist

twoDlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110]
regular2Dlist = convo(twoDlist)
print('Given List:', twoDlist)
print('Converted list:', functools.reduce(operator.iconcat, regular2Dlist, []))

輸出:

Given List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110]
Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]

說明:

在上面的例子中,我們已經導入了功能工具庫和操作符庫。然後,我們將一個空列表定義為常規列表。然後,我們定義了一個函數卷積來將列錶轉換為扁平列表。在這個函數中,我們將用於循環,其中嵌套列表中的元素被追加到我們之前定義的空列表中。稍後,我們已經定義了嵌套列表並執行了函數。因此,列表列表被成功轉換為展開列表。

使用 itertools 庫展開列表列表

itertools 庫提供了鏈()功能,允許我們理想地將嵌套列錶轉換為單個扁平列表。該函數通過以串列方式通過作為參數傳遞的 iterable 對連續序列進行迭代,將它們視為單個序列。

讓我們考慮下面的例子:

示例:


# importing the itertools library
import itertools

# defining the nested list
nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]]
flattenlist = list(itertools.chain(*nestedlist))

print('The nested list:', nestedlist)
print('The flattened list:', flattenlist

輸出:

The nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]]
The flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

說明:

在上面的例子中,我們已經導入了 itertools 庫並生成了一個嵌套列表。然後,我們使用鏈()函數將給定的嵌套列錶轉換為扁平列表。最後,我們將結果返回給用戶。結果,列表列表被成功展開。

使用 NumPy 庫展開列表列表

NumPy 庫提供各種日常操作,包括按列或按行連接二維常規數組。我們將使用稱為平面的屬性,以便在數組上獲得一維迭代器來征服目標。讓我們考慮下面的例子來理解 concatenate 函數和 flat 屬性的使用。

示例:


# importing the library
import numpy

# defining the nested list
nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]]

# using the concatenate function along with the flat attribute
flattenlist = list(numpy.concatenate(nestedlist).flat)

print('The Nested list:', nestedlist)
print('The Flattened list:', flattenlist)

輸出:

The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]]
The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]

說明:

在上面的例子中,我們已經導入了 numpy 庫並定義了一個嵌套列表。然後,我們使用了 numpy 庫的連接功能及其扁平屬性來展開嵌套列表的元素,並將它們連接到一個新的扁平列表。最後,我們為用戶列印了結果。因此,列表列表被成功展開。

我們還可以利用 Python 編程語言提供的一些核心功能來執行展開任務。

使用求和功能展開列表列表

我們可以考慮對內部列表求和,作為解決問題的另一種方法。我們將兩個參數傳遞給 sum 函數:第一個參數是可迭代,這是一個嵌套列表,第二個參數是 start ,這是一個空列表,用於以下情況,作為內部子列表的數據元素將添加到的初始平面列表。

我們可以說這種方法非常方便,因為我們不需要導入任何東西。但是,當嵌套列表中存在大量子列表時,它比 itertools() 和 chain() 函數慢。

讓我們考慮下面的例子:

示例:


# defining a nested list
nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]]

# using the sum function
flattenlist = sum(nestedlist, [])

print('The Nested list:', nestedlist)
print('The Flattened list:', flattenlist)

輸出:

The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]]
The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]

說明:

在上面的例子中,我們已經定義了嵌套列表。然後,我們使用 sum() 函數,將嵌套列表展開為一維列表,並為用戶列印結果列表。結果,我們成功地將列表列錶轉換為平面列表。

使用 Lambda 關鍵字展開列表列表

我們可以使用關鍵字λ定義一個匿名函數。我們可以將規則/不規則列表作為參數傳遞給這個匿名函數。表達式的計算是為了得到一個平面的一維列表。

讓我們考慮下面的例子:

示例:


# Defining the nested list
nestedlist = [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70]

# Using lambda parameters: expression
flattenlist = lambda nestedlist:[item for element in nestedlist for item in flattenlist(element)] if type(nestedlist) is list else [nestedlist]

print("The Nested list:", nestedlist)
print("The Flattened List:", flattenlist(nestedlist))

輸出:

The Nested list: [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70]
The Flattened List: [10, 20, 30, 30, 50, 60, 40, 60, 70, 70]

說明:

在上面的例子中,我們定義了一個嵌套列表。然後,我們使用了【λ】關鍵字以及定義列表推導表達式的參數。然後,我們為用戶列印了它們。因此,我們成功地將二維不規則列錶轉換為扁平列表。


原創文章,作者:A3HRY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/126899.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
A3HRY的頭像A3HRY
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論