色偷偷91综合久久噜噜-色偷偷成人-色偷偷尼玛图亚洲综合-色偷偷人人澡久久天天-国内精品视频一区-国内精品视频一区二区三区

Hello! 歡迎來到小浪云!


Python 中 set 是什么?為何要是用它?


avatar
小浪云 2025-01-24 226

Python 中 set 是什么?為何要是用它?

Python 提供多種內置數據結構用于組織數據,包括列表、字典、元組和集合。

根據 Python 3 文檔,集合是無序的、不包含重復元素的集合。其主要用途包括成員測試去除重復項。集合還支持集合運算,如并集交集差集對稱差集

本文將通過示例闡述以上定義中的每個特性,并講解集合的創建方法。

**集合的初始化**

創建集合有兩種方法:一是將元素列表傳遞給內置函數 `set()`,二是使用花括號 `{}`。

使用 set() 函數初始化集合:

立即學習Python免費學習筆記(深入)”;

>>> s1 = set([1, 2, 3]) >>> s1 {1, 2, 3} >>> type(s1) <class 'set'>

使用 {} 初始化集合:

>>> s2 = {3, 4, 5} >>> s2 {3, 4, 5} >>> type(s2) <class 'set'>

兩種方法均有效。但如果需要創建空集合呢?

>>> s = {} >>> type(s) <class 'dict'>

使用空花括號將創建一個字典,而非集合。

為簡便起見,本文示例使用整數集合,但集合可包含所有 Python 支持的可哈希hashable[1]數據類型,例如整數、字符串和元組,但不包括列表或字典等可變類型。

>>> s = {1, 'coffee', [4, 'Python']} Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'

了解了集合的創建方法及其可包含的元素類型后,我們來探討一下為什么應該將集合納入你的編程工具箱。

**為什么需要使用集合**

編程中,解決問題的方法不止一種。有些方法效率低下,而另一些則清晰、簡潔、易于維護,或者更“Pythonicpythonic[2]”。

根據 Python Hitchhiker’s Guide[3]:

當經驗豐富的 Python 開發者(PythonistaPythonista)遇到不夠“Pythonicpythonic”的代碼時,通常認為這些代碼不符合通用指南,表達意圖的方式不夠理想(可讀性差)。

讓我們看看集合如何提升代碼可讀性并提高程序執行效率。

**集合元素的無序性**

集合元素無法通過索引訪問:

>>> s = {1, 2, 3} >>> s[0] Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: 'set' object does not support indexing

也無法使用切片修改:

>>> s[0:2] Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: 'set' object is not subscriptable

但如果需要去除重復項或進行集合運算(如并集),則應該使用集合。

迭代時,集合的效率優于列表。原因涉及集合的內部實現細節,感興趣的讀者可以參考以下鏈接:

  • 時間復雜度[4]
  • set() 的實現[5]
  • Python 集合 vs 列表[6]
  • 列表中使用集合的優缺點[7]
**集合不包含重復項**

過去,我經常使用 `for` 循環和 `if` 語句來檢查并去除列表中的重復元素,代碼如下:

>>> my_list = [1, 2, 3, 2, 3, 4] >>> no_duplicate_list = [] >>> for item in my_list: ...     if item not in no_duplicate_list: ...             no_duplicate_list.append(item) ... >>> no_duplicate_list [1, 2, 3, 4]

或者使用列表推導式:

>>> my_list = [1, 2, 3, 2, 3, 4] >>> no_duplicate_list = [] >>> [no_duplicate_list.append(item) for item in my_list if item not in no_duplicate_list] [None, None, None, None] >>> no_duplicate_list [1, 2, 3, 4]

現在,我們可以使用集合:

>>> my_list = [1, 2, 3, 2, 3, 4] >>> no_duplicate_list = list(set(my_list)) >>> no_duplicate_list [1, 2, 3, 4]

使用 timeit 模塊比較列表和集合去除重復項的效率:

>>> from timeit import timeit >>> def no_duplicates(list): ...     no_duplicate_list = [] ...     [no_duplicate_list.append(item) for item in list if item not in no_duplicate_list] ...     return no_duplicate_list ... >>> # 列表的執行時間: >>> print(timeit('no_duplicates([1, 2, 3, 1, 7])', globals=globals(), number=1000)) 0.0018683355819786227
>>> from timeit import timeit >>> # 集合的執行時間: >>> print(timeit('list(set([1, 2, 3, 1, 2, 3, 4]))', number=1000)) 0.0010220493243764395 >>> # 更快更簡潔

使用集合比列表推導式更簡潔,效率更高。

注意:集合是無序的,轉換為列表后元素順序可能發生變化。

Python 之禪[8]:

優美勝于丑陋Beautiful is better than ugly.

明了勝于晦澀Explicit is better than implicit.

簡潔勝于復雜Simple is better than complex.

扁平勝于嵌套Flat is better than nested.

集合正是如此。

**成員測試**

使用 `if` 語句檢查元素是否存在于列表中,稱為成員測試:

my_list = [1, 2, 3] >>> if 2 in my_list: ...     print('Yes, this is a membership test!') ... Yes, this is a membership test!

集合的成員測試效率更高:

>>> from timeit import timeit >>> def in_test(iterable): ...     for i in range(1000): ...             if i in iterable: ...                     pass ... >>> timeit('in_test(iterable)', ... setup="from __main__ import in_test; iterable = list(range(1000))", ... number=1000) 12.459663048726043
>>> from timeit import timeit >>> def in_test(iterable): ...     for i in range(1000): ...             if i in iterable: ...                     pass ... >>> timeit('in_test(iterable)', ... setup="from __main__ import in_test; iterable = set(range(1000))", ... number=1000) .12354438152988223

注意:以上測試來自 StackOverflow[9]。

對于大型列表,將其轉換為集合可以提高成員測試效率。

**如何使用集合**

了解了集合及其用途后,我們來快速瀏覽一下集合的修改和操作方法。

**添加元素**

根據需要添加的元素數量,選擇 `add()` 或 `update()` 方法。

add() 用于添加單個元素:

>>> s = {1, 2, 3} >>> s.add(4) >>> s {1, 2, 3, 4}

update() 用于添加多個元素:

>>> s = {1, 2, 3} >>> s.update([2, 3, 4, 5, 6]) >>> s {1, 2, 3, 4, 5, 6}

集合會自動去除重復元素。

**移除元素**

如果需要在刪除不存在的元素時引發異常,使用 `remove()`;否則,使用 `discard()`:

>>> s = {1, 2, 3} >>> s.remove(3) >>> s {1, 2} >>> s.remove(3) Traceback (most recent call last):   File "<stdin>", line 1, in <module> KeyError: 3

discard() 不會引發異常:

>>> s = {1, 2, 3} >>> s.discard(3) >>> s {1, 2} >>> s.discard(3) >>> # 無任何操作

pop() 用于隨機移除一個元素:

>>> s = {1, 2, 3, 4, 5} >>> s.pop()  # 移除一個任意元素 1 >>> s {2, 3, 4, 5}

clear() 用于清空集合:

>>> s = {1, 2, 3, 4, 5} >>> s.clear()  # 清空集合 >>> s set()
**并集 `union()`**

`union()` 或 `|` 操作符創建包含所有元素的新集合:

>>> s1 = {1, 2, 3} >>> s2 = {3, 4, 5} >>> s1.union(s2)  # 或 's1 | s2' {1, 2, 3, 4, 5}
**交集 `intersection()`**

`intersection()` 或 `&` 操作符返回集合的公共元素:

>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s3 = {3, 4, 5} >>> s1.intersection(s2, s3)  # 或 's1 & s2 & s3' {3}
**差集 `difference()`**

`difference()` 或 `-` 操作符創建新集合,包含在 `s1` 中但在 `s2` 中不存在的元素:

>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s1.difference(s2)  # 或 's1 - s2' {1}
**對稱差集 `symmetric_difference()`**

`symmetric_difference()` 或 `^` 操作符返回集合中不同的元素:

>>> s1 = {1, 2, 3} >>> s2 = {2, 3, 4} >>> s1.symmetric_difference(s2)  # 或 's1 ^ s2' {1, 4}
**結論**

本文介紹了 Python 集合的概念、操作方法和應用場景。熟練掌握集合的使用可以編寫更清晰、更高效的代碼。

如有任何疑問,請隨時提出。此外,Python 速查表[10]中也包含了集合的相關內容[11],方便查閱。

相關閱讀

主站蜘蛛池模板: 99热在线免费 | 国产区精品 | 污污视频在线观看黄 | 美国一级毛片片aaa 美国一级做a一级视频 | 国产精品免费精品自在线观看 | 三级视频网站在线观看播放 | 国内精品影院久久久久 | 免费涩涩视频 | 国产亚洲欧美一区 | 中文字幕久久网 | 日韩伦理免费 | 一区二区三区四区国产 | 婷婷综合久久中文字幕一本 | 国产va免费精品观看精品 | 日韩专区在线观看 | 久久一本日韩精品中文字幕屁孩 | 欧美区一区 | 国产精品久久久精品视频 | 久久网综合 | 国产精品视频久久久久久 | 午夜a级理论片在线播放一级 | 三级网址在线观看 | 香港三级日本三妇三级一 | 国产国语一级毛片在线视频 | 色www永久免费 | 五月欧美激激激综合网色播 | 国产欧美日韩综合精品一区二区三区 | 欧美日本一区二区三区 | 精品国产一区二区三区免费看 | 欧美日日日| 国产三级三级三级 | 国产精品国产三级国产专 | 中文字幕一区久久久久 | 黄色片网站大全 | 久久www免费人成看片色多多 | 国产日韩欧美一区二区三区视频 | 国产黄色毛片 | 国产亚洲欧美另类一区二区三区 | 99国内精品久久久久久久黑人 | 人人揉揉香蕉 | 三级免费|