Python - 巢狀列表和混合列表中的型別轉換


Python 今天被廣泛使用和接受,因為它具有多功能性和可讀性。其強大的功能使開發人員能夠輕鬆地執行復雜的任務。其中一個重要的功能是型別轉換或型別強制轉換。特別是對於 Python 列表,它們本質上是異構的,這通常需要將每個巢狀列表元素或列表轉換為特定資料型別才能使用。在混合列表中,它變得更加複雜。

在本文中,我們將嘗試理解和實現巢狀列表和混合列表中的型別轉換。透過程式碼,我們將解碼 Python 功能以實現相同的功能。

在我們開始使用列表之前,我們需要了解型別轉換或型別強制轉換。Python 中的型別強制轉換是指根據方便性或可行性轉換值或變數的資料型別。Python 有一些內建函式可以促進型別轉換,這些函式在處理巢狀列表和混合列表時非常有用。

巢狀列表和混合列表

當一個列表包含在另一個列表內時,它被稱為巢狀列表。這些巢狀列表可以包含更多巢狀列表作為其元素,遵循層次結構。在處理巢狀列表,尤其是在型別轉換時,有必要了解型別轉換將如何影響整個結構。

混合列表體現了 Python 列表的異構特性。它是一個包含不同資料型別元素的列表,例如整數、浮點數、列表、元組等。處理混合列表中的型別轉換需要稍微不同的方法。我們需要獨立處理每個元素並將其轉換為所需型別。

巢狀列表和混合列表中的型別轉換是轉換子列表或元組或任何可迭代物件中的元素,以便保留整個列表的原始結構。現在,讓我們逐一瞭解一些方法。

方法 #1:列表推導式

列表推導式是一種非常簡單且優雅的方法,用於轉換巢狀列表中的元素。它允許我們建立一個新的巢狀列表,迭代每個元素並應用所需的型別轉換操作。

示例

listEnter = [6, 5, [1,2], 3]
print("List entered: "+ str(listEnter))

result = [[str(ele) for ele in sublist] if isinstance(sublist, list) else str(sublist) for sublist in listEnter]
print("After conversion: "+ str(result))

輸出

List entered: [6, 5, [1, 2], 3]
After conversion: ['6', '5', ['1', '2'], '3']

我們使用了一個語句,其中迭代子列表中的每個元素(如果它是主列表的一部分),並將其轉換為字串。否則,它將主列表中的元素轉換為字串。透過這種方式,保留了原始結構,但各個元素被轉換了。

方法 #2:使用遞迴

遞迴或使用 for 迴圈,迭代每個元素並根據我們的要求顯式地進行轉換。可以定義一個函式來迭代和轉換元素。我們需要檢查是否存在內部列表、元組或其他可迭代物件,在這種情況下,我們可以再次遞迴呼叫該函式來迭代混合列表中的每個巢狀列表或元組等,以轉換其中的每個元素。所以我們將編寫程式碼並理解。

示例

def typeCast(listInput):
    if isinstance(listInput, list):
        return [typeCast(inputItem) for inputItem in listInput]
    else:
        return str(listInput)

listEnter = [6, 5, [1,2], 3]
print("List entered: "+ str(listEnter))

result = typeCast(listEnter)
print("After conversion: "+ str(result))

輸出

List entered: [6, 5, [1, 2], 3]
After conversion: ['6', '5', ['1', '2'], '3']

很明顯,typeCast() 遞迴函式迭代列表的每個元素。當元素本身就是一個列表時,函式會將列表本身傳遞進去。否則,它會將其元素轉換為字串。

這個過程會繼續進行。在理解了巢狀列表中的遞迴實現之後。讓我們檢查一下在混合列表中使用它的可能方法。

示例

def typeCast(inputEle):
    if isinstance(inputEle, list):
        return [typeCast(ele) for ele in inputEle]
    elif isinstance(inputEle, tuple):
        return tuple(typeCast(ele) for ele in inputEle)
    else:
        return int(inputEle)

def typeCast2(inputEle):
    if type(inputEle) is list:
        return [typeCast2(ele) for ele in inputEle]
    elif type(inputEle) is tuple:
        return tuple(typeCast2(ele) for ele in inputEle)
    else:
        return int(inputEle)

listInput = ['1', '2', ('3', ['4', '5']), ['6', '7']]
print("Input list is: " + str(listInput))

res1 = typeCast(listInput)
print("Using isinstance() converted: " + str(res1))

res2 = typeCast2(listInput)
print("Using type() converted: " + str(res2))

輸出

Input list is: ['1', '2', ('3', ['4', '5']), ['6', '7']]
Using isinstance() converted: [1, 2, (3, [4, 5]), [6, 7]]
Using type() converted: [1, 2, (3, [4, 5]), [6, 7]]

在這個程式碼中,我們看到了類似的實現,使用了 isinstance() 函式並迭代每個元素,檢查多種資料型別。如果匹配,則再次呼叫函式傳遞資料,否則將元素轉換為整數。

除此之外,還有一種使用 type() 而不是 isinstance() 的方法,它給我們相同的輸出。在 Python 中,isinstance() 用於檢查物件是否為特定資料型別,否則返回 false。而 type() 主要用於除錯。當傳遞單個引數時,它會返回物件的型別。

兩者具有相同的時間和空間複雜度,因此其使用取決於方便性。

方法 #3:實現 map 和 lambda

Python 中的 map() 函式允許我們將指定的函式應用於列表或其他可迭代物件中的每個元素。它接受兩個引數:可迭代物件和函式。讓我們將它與 lambda 函式一起使用,以對混合列表中的每個元素進行型別轉換。

示例

def typeCast(inputEle):
    return list(map(lambda x: typeCast(x) if isinstance(x, (list, tuple)) else int(x), inputEle))

listInput = ['1', '2', ('3', ['4', '5']), ['6', '7']]
print("Input list is: " + str(listInput))

res = typeCast(listInput)
print("After conversion: " + str(res))

輸出

Input list is: ['1', '2', ('3', ['4', '5']), ['6', '7']]
After conversion: [1, 2, (3, [4, 5]), [6, 7]]

我們可以看到 map 函式的效率有多高;它使列表中的每個元素都透過 lambda 函式中定義的函式進行迭代。lambda 函式使用 isinstance() 檢查每個元素是否為列表或元組,並在混合列表中的每個巢狀列表或元組內遞迴呼叫 typecast() 函式。否則,它將其轉換為整數。這樣,每個元素都會被迭代並轉換為整數。

然後,map 函式使用此 lambda 函式處理輸入列表的每個元素,並返回一個迭代器。我們使用 list() 函式將返回的迭代器轉換回列表。

結論

在本文中,我們試圖瞭解巢狀列表和混合列表,以及如何對其資料進行型別轉換。我們學習了型別轉換或型別強制轉換可以幫助我們根據需要更改資料型別,這在處理複雜資料結構時非常有用。我們討論了三種可以用於巢狀列表和混合列表以實現相同目標的有用方法。

瞭解型別轉換對於 Python 開發人員來說是一項至關重要的技能,因為它可以幫助我們有效地操作資料,並確保程式的正常執行。除此之外,我們還留下了其他實現方法的空間。嘗試並探索。

更新於:2023年8月29日

320 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告