Python 集合與列表——真正的區別

Python 集合與列表——真正的區別

在 Python 編程的世界裡,你會經常遇到各種服務於不同目的的數據結構。在這些結構中,集合和列表通常用於存儲和操作數據集合。

雖然它們可能看起來相似,但它們的屬性和用例存在顯著差異。

Python 集合與列表——真正的區別

目錄

了解 Python 集合和列表

好的,讓我們先解釋一下。

什麼是 Python 集?

Python集合是一種內置數據結構,表示不同元素(稱為成員)的無序集合。

這個強大的工具在數據科學應用和數學運算中特別有用。

Python 集合具有以下屬性:

  1. 它們是無序的,這意味著集合中的元素的存儲獨立於它們的索引。這種唯一值的無序集合支持高效的成員測試和集合推導。

  2. 他們不允許重複值。這使得它們在您需要處理唯一值、從列表中刪除重複項或執行集合操作(​​如聯合、交集和對稱差異)時非常有用。

在 Python 中有兩種創建集合的方法:

  1. 通過使用花括號 ({}),也稱為花括號。

  2. 通過使用內置的 set() 函數,它接受一個參數,一個包含要包含在集合中的元素的可迭代對象。

下面給出了使用大括號和內置 set 函數創建 Python 集合的通用語法:

my_set = {1, 2, 3}
another_set = set([4, 5, 6])

什麼是 Python 列表

Python 列表是一種內置數據結構,類似於其他編程語言中的動態數組。

它們用於將多個項目存儲在單個變量中,使它們成為處理各種數據類型(如字符串、數字和布爾值)的通用選項。

Python 列表具有以下屬性:

  1. 它們是有序的,這意味著特定元素在列表中具有唯一位置,可以通過其索引訪問。此有序集合支持隨機訪問,允許您執行切片、串聯和列表理解等操作。

  2. 它們是可變的,並且它們的元素可以在創建列表後更改,從而在使用數據結構時提供靈活性。

  3. Python 列表允許重複值,並且可以存儲混合數據類型,包括字符串、數字和布爾值。

在 Python 中創建列表有兩種方法:

  1. 通過使用方括號,它表示列表的邊界。

  2. 通過使用內置的 list() 函數,它可以採用單個參數或包含要包含在列表中的元素的可迭代對象。

以下 Python 代碼演示了使用方括號和內置 list() 函數創建 Python 列表:

list1 = [1, 2, 3] 
list2 = list([4, 5, 6])

集合和列表之間的 3 個主要區別

它們是 Python 集合和列表之間的多個差異。下面列出了一些重要的:

1. 訂單和索引

Python列表中的順序和索引: Python 列表可以支持索引,這意味著您可以使用列表中的位置來訪問列表中的元素。這在以已知順序操作數據時提供了靈活性。

以下Python代碼演示了列表的順序和索引:

# Creating a Python list
my_list = [3, 5, 2, 8, 1]

# Accessing elements using their index
first_element = my_list[0]  # This will be 3
third_element = my_list[2]  # This will be 2

# Modifying elements using their index
my_list[1] = 7  # The list becomes [3, 7, 2, 8, 1]

# Iterating over a list maintaining the order
for item in my_list:
    print(item)

Python 集合與列表——真正的區別

Python 集合: Python 集合是沒有索引的無序集合,這意味著您無法使用元素的位置來訪問元素。當元素的順序無關緊要時,這很有用。

以下 Python 代碼演示了順序和索引集:

# Creating a Python set
my_set = {3, 5, 2, 8, 1}

# Sets are unordered, so you cannot access elements using their position
# This would raise an error: first_element = my_set[0]

# Modifying a set by adding or removing elements
my_set.add(6)       # The set becomes {1, 2, 3, 5, 6, 8}
my_set.discard(5)   # The set becomes {1, 2, 3, 6, 8}

# Iterating over a set (order is not guaranteed)
for item in my_set:
    print(item)

Python 集合與列表——真正的區別

2. 可變性

Python 列表: Python 列表是可變的,允許您修改其元素。它們可以容納任何類型的對象,包括嵌套列表,從而在它們可以存儲的內容方面提供更大的靈活性。

以下代碼演示了 Python 列表中的可變性:

# Creating a Python list
my_list = [3, 5, 2, 8, 1]

# Modifying the list by appending elements
my_list.append(4)  # The list becomes [3, 5, 2, 8, 1, 4]

# Modifying the list by removing elements
my_list.remove(2)  # The list becomes [3, 5, 8, 1, 4]

# Lists can hold any type of object, including nested lists
nested_list = [1, 2, [3, 4], 5]

Python 集合與列表——真正的區別

Python 集合:就像Python 中的列表一樣,Python 集合也是可變的,可以修改。但是,Python 中的集合只能保存可哈希(不可變)對象,這意味著您不能擁有一組集合或包含可變對象(如列表)的集合。

以下代碼演示了 Python 集的可變性:

# Creating a Python set
my_set = {3, 5, 2, 8, 1}

# Modifying the set by adding elements
my_set.add(6)       # The set becomes {1, 2, 3, 5, 6, 8}

# Modifying the set by removing elements
my_set.discard(5)   # The set becomes {1, 2, 3, 6, 8}

# Sets can only hold hashable (immutable) objects
valid_set = {1, 2, 3, 4, (5, 6)}

# The following would raise an error because lists are mutable and cannot be stored in sets
# invalid_set = {1, 2, [3, 4]}

Python 集合與列表——真正的區別

元素的唯一性

Python 集合:集合的一個關鍵特性是它們只存儲唯一的元素。忽略向列表添加重複值。這使得集合對象非常適合不同的集合操作,例如刪除重複項或檢查唯一元素的存在。

# Creating a Python set with duplicate elements
my_set = {3, 5, 2, 8, 1, 3, 2, 5}
# The duplicate elements are automatically removed: {1, 2, 3, 5, 8}

# Checking for the presence of a unique element
if 5 in my_set:
    print("5 is in the set")
# Output: 5 is in the set

# Removing duplicates from a list using a set
my_list = [3, 5, 2, 8, 1, 3, 2, 5]
unique_list = list(set(my_list))
# The unique_list becomes [1, 2, 3, 5, 8]
  • Python 集合與列表——真正的區別

    Python 列表:列表允許重複值並保持它們的順序,這在重複項和元素順序起重要作用的用例中是必不可少的。

    # Creating a Python list with duplicate elements
    my_list = [3, 5, 2, 8, 1, 3, 2, 5]
    # The list contains duplicate values: [3, 5, 2, 8, 1, 3, 2, 5]
    
    # Checking for the presence of an element in a list
    if 5 in my_list:
        print("5 is in the list")
    # Output: 5 is in the list
    
    # Counting the occurrences of a value in a list
    count_of_5 = my_list.count(5)
    print("5 appears", count_of_5, "times")
    # Output: 5 appears 2 times

    Python 集合與列表——真正的區別

3. 支持的操作

可以對集合和列表執行不同的操作,每一種都針對特定任務進行了優化:

Python 列表:由於其有序和基於索引的特性,列表支持切片、連接、重複和列表理解等操作。它們還提供內置方法,例如 append()、pop() 和 sort(),允許您操作列表的元素。

# Creating a Python list
my_list = [3, 5, 2, 8, 1]

# Slicing a list
sub_list = my_list[1:4]  # The sub_list becomes [5, 2, 8]

# Concatenation of two lists
list1 = [1, 2, 3]
list2 = [4, 5, 6]
concatenated_list = list1 + list2  # The concatenated_list becomes [1, 2, 3, 4, 5, 6]

# Repetition of a list
repeated_list = list1 * 2  # The repeated_list becomes [1, 2, 3, 1, 2, 3]

# List comprehension
squared_list = [x ** 2 for x in my_list]  # The squared_list becomes [9, 25, 4, 64, 1]

# Using built-in methods
my_list.append(4)  # The list becomes [3, 5, 2, 8, 1, 4]
my_list.pop()      # The list becomes [3, 5, 2, 8, 1]
my_list.sort()     # The list becomes [1, 2, 3, 5, 8]

Python 集合與列表——真正的區別

Python 集合:集合經過優化以執行與集合相關的操作,例如並集、交集、差集,以及使用散列函數檢查成員資格以快速查找元素。由於它們是無序的並且沒有索引,集合操作不同於基於列表的操作。

# Creating Python sets
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# Union operation
union_set = set1.union(set2)  # The union_set becomes {1, 2, 3, 4, 5, 6, 7, 8}

# Intersection operation
intersection_set = set1.intersection(set2)  # The intersection_set becomes {4, 5}

# Difference operation
difference_set = set1.difference(set2)  # The difference_set becomes {1, 2, 3}

# Checking membership
if 3 in set1:
    print("3 is a member of set1")
# Output: 3 is a member of set1

Python 集合與列表——真正的區別

如何選擇正確的數據結構?

使用 Python 時,必須為您的特定任務選擇最合適的數據結構。在本節中,我們將討論使用集合和列表的最佳場景,以及它們的獨特優勢。

讓我們開始吧。

集合的用例

套裝具有多項優勢,使其成為某些任務的理想選擇:

唯一性:如果您需要存儲獨特元素的集合,集合是最佳選擇。集合會自動消除重複項,確保集合中的每個元素都是不同的。

成員資格測試:與列表相比,集合提供更快的成員資格測試。由於其底層哈希表實現和哈希函數的使用,集合允許基於哈希值的高效查找。

集合運算:集合支持並集、交集、差分和對稱差分等運算,這些運算在許多算法、數據處理任務和數據科學應用程序中都很有用。

列表的用例

列表更適合以下場景:

有序數據:列表維護元素的順序,使其適用於需要遵守項目順序的任務,例如按創建順序處理數據或需要支持索引時。

可變數據:列表是可變的,允許您根據需要添加、刪除或修改特定元素。這種靈活性使列表適用於涉及更改集合內容的任務或處理嵌套數據結構(例如列表或字典的列表)時的任務。

非唯一元素:與集合不同,列表可以存儲重複元素,使它們適用於項目頻率很重要的情況,例如計算出現次數或維護重複值的順序。

查看以下內容以進一步學習。

集合與列表的性能比較

在本節中,我們將比較 Python 集合和列表在時間複雜度和內存使用方面的性能,這在處理大型數據結構或優化代碼以提高效率時至關重要。

時間複雜度

就時間複雜度而言,集合和列表具有不同的優點和缺點,具體取決於您由於其底層實現而執行的操作。

  1. 搜索:集合使用散列查找和散列函數,與列表相比,這使得搜索項目的速度明顯加快。例如,使用列表搜索 100,000 個項目需要 49.663 秒,但使用集合只需 0.007 秒,因為它利用哈希值進行快速訪問。

  2. 迭代:在迭代項目時,列表比集合稍快。這是因為集合需要額外的操作來確保唯一性,而列表則通過直接索引維護一個簡單的有序集合。

內存使用情況

集合通常比列表消耗更多的內存,因為它們需要維護哈希表以確保項目的唯一性,這是以增加內存消耗為代價的。

列表僅按順序存儲元素,從而降低內存消耗,使其成為處理大型數據集合時內存效率更高的選擇。

import time
import random

# Generating a large list and set with 100,000 random integers
large_list = [random.randint(1, 1_000_000) for _ in range(100_000)]
large_set = set(large_list)

# Searching for an item in the list and set
search_value = random.randint(1, 1_000_000)

# Measuring the time it takes to search for the item in the list
start_time = time.time()
result = search_value in large_list
end_time = time.time()
list_search_time = end_time - start_time
print(f"List search time: {list_search_time:.6f} seconds")

# Measuring the time it takes to search for the item in the set
start_time = time.time()
result = search_value in large_set
end_time = time.time()
set_search_time = end_time - start_time
print(f"Set search time: {set_search_time:.6f} seconds")

# Iterating over the list and set
# Measuring the time it takes to iterate over the list
start_time = time.time()
for item in large_list:
    pass
end_time = time.time()
list_iter_time = end_time - start_time
print(f"List iteration time: {list_iter_time:.6f} seconds")

# Measuring the time it takes to iterate over the set
start_time = time.time()
for item in large_set:
    pass
end_time = time.time()
set_iter_time = end_time - start_time
print(f"Set iteration time: {set_iter_time:.6f} seconds")

提供的代碼展示了 Python 集合和列表在搜索和迭代的時間複雜度方面的性能比較。

它生成一個大列表和一組隨機整數,用花括號(也稱為花括號)括起來。

然後它測量搜索特定項目所花費的時間,在列表和集合中使用單個參數,並測量循環訪問列表和集合中的所有元素所花費的時間。

Python 集合與列表——真正的區別

輸出說明了 Python 列表和集合在搜索和迭代方面的性能差異,這些差異源於它們的底層實現。

由於使用散列函數計算散列值以進行高效查找,搜索操作在集合中(0.000000 秒)比在列表中(0.002999 秒)更快。但是,迭代列表(0.007995 秒)比迭代集合(0.017989 秒)稍快,因為集合需要額外的操作來確保唯一性。

常用操作和方法

Python 中的集合和列表都有各種操作和方法,每個操作和方法都針對特定任務和數據操作進行了優化。下面列出了其中一些方法:

設置方法

Set 方法執行類似於數學運算的操作,是處理集合中唯一值的強大工具。

  • add(element):如果元素不存在,則將其添加到集合中。

  • remove(element):從集合中移除指定的元素;如果找不到該元素,則會引發錯誤。

  • discard(element):如果指定元素存在,則從集合中移除該元素。如果找不到該元素,則不會引發錯誤。

  • union(set2):返回一個包含原始集合和集合 2 中所有元素的新集合,有效地執行集合操作。

  • intersection(set2):返回一個新集合,其中包含原始集合和 set2 共有的元素。

  • difference(set2):返回一個新集合,包含原始集合中的元素,但不在 set2 中。

  • symmetric_difference(set2):返回一個新集合,其中包含原始集合或 set2 中的元素,但不包含兩者。

列表方法

列表方法提供了多種操作數據的方法。

  • append(element):將一個元素添加到列表的末尾。

  • extend(iterable):將可迭代對象(例如,另一個列表)中的所有元素附加到列表的末尾。

  • insert(index, element):在指定索引處插入一個元素。

  • remove(element):刪除列表中第一個出現的指定元素;如果元素不存在則引發錯誤。

  • pop(index):移除並返回指定索引處的元素。如果沒有給出索引,它會刪除最後一個元素。

  • index(element):返回指定元素在列表中第一次出現的索引。

  • count(element):返回指定元素在列表中出現的次數。

  • sort():默認按升序對列表進行排序;對於降序,使用 reverse=True 參數。

  • reverse():反轉列表中元素的順序。

通過使用這些 Python 集合和列表方法,您可以有效地操作數據並解決 Python 編程、數據科學和其他應用程序中的各種問題。

我們的最終決定權

在為您的數據結構選擇 Python 列表和集合時,如果您需要有序的項目集合、想要保留重複元素並需要能夠按索引訪問元素,請考慮使用列表。

當元素的唯一性至關重要,元素的順序不重要,並且首選更快的成員資格測試時,請選擇集合。雖然列表在迭代方面表現出色,但集合提供了更有效的包含檢查。

您的選擇最終取決於項目的要求,因為每種數據結構都有其自身的優點和局限性,這使它們成為處理 Python 編程中各種任務的強大工具。享受!


什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

如何在 R 中保存和加載 RDS 文件

如何在 R 中保存和加載 RDS 文件

您將學習如何在 R 中保存和加載 .rds 文件中的對象。本博客還將介紹如何將對像從 R 導入 LuckyTemplates。

回顧前 N 個工作日——DAX 編碼語言解決方案

回顧前 N 個工作日——DAX 編碼語言解決方案

在此 DAX 編碼語言教程中,了解如何使用 GENERATE 函數以及如何動態更改度量標題。

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

本教程將介紹如何使用多線程動態可視化技術從報告中的動態數據可視化中創建見解。

LuckyTemplates 篩選上下文簡介

LuckyTemplates 篩選上下文簡介

在本文中,我將貫穿過濾器上下文。篩選上下文是任何 LuckyTemplates 用戶最初應該了解的主要主題之一。

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

我想展示 LuckyTemplates Apps 在線服務如何幫助管理從各種來源生成的不同報告和見解。

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

了解如何在 LuckyTemplates 中使用度量分支和組合 DAX 公式等技術計算利潤率變化。

DAX Studio 中數據緩存的物化想法

DAX Studio 中數據緩存的物化想法

本教程將討論數據緩存物化的想法,以及它們如何影響 DAX 在提供結果時的性能。

使用 LuckyTemplates 進行業務報告

使用 LuckyTemplates 進行業務報告

如果直到現在你還在使用 Excel,那麼現在是開始使用 LuckyTemplates 來滿足你的業務報告需求的最佳時機。

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的