国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python奇遇記:數據結構窺探3

toddmark / 965人閱讀

摘要:字典和集合都是基于散列表實現的,散列表也就是表,了解過數據結構的應該知道。而使用另一種辦法,任何鍵在找不到的情況下都會用中的值數據類型比如替換。在設計時就可以使用創建你的數據接口。

這次主要說說字典和集合這兩種數據類型。

字典和集合都是基于散列表實現的,散列表也就是hash表,了解過數據結構的應該知道。與散列表相關的一個概念叫做可散列,什么是可散列?在python官方定義中是這樣說的:如果一個對象是可散列的,那么在這個對象的生命周期中,它的散列值是不變的,而且這個對象需要實現__hash__()方法。

python中,原子不可變類型(str、bytes和數值類型)都是可散列類型,同時所有的不可變類型也是可散列的。

集合

什么是集合?在數學中指的是具有某種特定性質的事物的總體,在python中集合指許多唯一對象的聚集。注意這個唯一,也就是說集合中不允許重復值出現,所以集合可以用來去重。

在python中,用大括號括起來表示一個集合。

data = [11, 11, 2, 3, 4, 4, 5, 4, 6]
set(data)
{2, 3, 4, 5, 6, 11}


將列表類型的data轉換為集合類型后,重復值被去掉了。

在數學中,集合可以求并集、交集、差集等,python也可以做同樣的事。比如:

data1 = {1, 2, 3, 4, 5}
data2 = {3, 4, 5, 6, 7}
# 交集
print(data1 & data2)
# 差集
print(data1 - data2)
# 并集
print(data1 | data2)
{3, 4, 5}
{1, 2}
{1, 2, 3, 4, 5, 6, 7}

上面說過,集合類型用大括號表示,如果我需要創建一個空集合,是不是用{ }表示就行了?問題來了,空集合用{ }表示,空字典也用{ }表示,這肯定不行。python中,創建一個空集合使用set()生成,{ }只會創建一個空的字典。

還有一個要提到的是集合推導。和列表推導、字典推導類似,這里就不講了。

字典

字典中有幾個方法需要說一下,看個例子。

a = {"x": 1, "y": 2, "z": 3}

# a.keys()返回所有鍵的集合,a.items()返回鍵值對集合,a.values返回值集合
# 可對字典進行集合運算,比較大小等運算
b = {"w" : 10,"x" : 11,"y" : 2}
# 直接進行集合操作,a.values()不可以
print(a.keys() & b.keys())
print(a.items() & b.items())
print(a.keys() - b.keys())
{"x", "y"}
{("y", 2)}
{"z"}

在字典中,可以使用a.keys()返回所有鍵的集合,a.items()返回鍵值對集合,a.values返回值集合,既然返回的是集合,就可以使用上面集合中說到的運算,大大簡化操作。

在查找字典中的某個鍵時,如果鍵不存在就會報錯,影響程序運行,為了避免不必要的麻煩,我們可以使用d.get(k, default),給找不到的鍵一個默認值。使用get的問題是,它不太符合python的哲學,d[k]比d.get(k)更加直觀和簡潔。

其實我們還可以這樣,使用setdefault(k, default)來指定一個默認值,這個方法比get方法更高效,但是我們需要指定特殊的鍵。而使用另一種辦法defaultdict(),任何鍵在找不到的情況下都會用defaultdict()中的值(數據類型比如list、str)替換。

d = {1: "a", 2: "b", 3: "c"}
d.get(4, "d")

import collections
from collections import defaultdict

d.setdefault(4, "d")
d[4]
# 如果查詢5找不到,還要指定默認值

# 找不到的話用空字符串替換
d = defaultdict(str)

d[5]
""


第二個要說的是OrderedDict,它可以保持字典中的順序,插入時是什么樣就是什么樣,不會改變。在設計API時就可以使用OrderDict創建你的數據接口。

怎么合并兩個或者多個字典?使用ChainMap,接受字典作為參數,如果參數中某個鍵重復了,ChainMap會返回第一個字典中的值,這個方法也是放在collections模塊下。

a = {"x": 1, "z": 3 }
b = {"y": 2, "z": 4 }

from collections import ChainMap
c = ChainMap(a,b)
print(c["x"])
print(c["y"])
# 只會返回第一個參數a中的z
print(c["z"])
1
2
3



本人才疏學淺,上文中難免有些錯誤,還請各位品評指正。如果覺得寫的還行,歡迎關注我的公眾號MLGroup,帶你走進機器學習的世界。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41049.html

相關文章

  • Python奇遇數據結構窺探2

    摘要:找出列表中小于的數據除了列表推導式,還有字典推導式,集合推導式,用法都一樣。如果你的數據量很大的話,考慮使用生成器表達式。切片不僅對列表有用,同樣適用于元組和字符串。切片命名使用方法,內部參數與切片一樣。對剩余的的數據,使用星號代替即可。 上次我們講了幾個不常見的數據類型,每個都有自己特殊的用途,雖然不經常用到,了解一下也好。比如我們提到的數組類型,如果在數據量很大的時候同時要效率,就...

    Ocean 評論0 收藏0
  • Python奇遇數據結構窺探

    摘要:擠掉了堆中實現了堆排序。你可以用堆排序來查找一個序列中最大的或者最小的幾個元素。除了使用堆排序,中還有排序和,這兩個排序最終生成以列表表示的排序結果,堆排序也是。 這次我們來說說python中的數據結構。當然了,不會講很基礎的內容。 用過python的都知道,python有著與其他語言很不一樣的數據類型,像什么列表、元組、集合、字典之類。這些數據類型造就了python簡單易用同時又很強...

    mrli2016 評論0 收藏0
  • Python奇遇:特殊方法窺探

    摘要:在中,特殊方法以雙下劃線開始,以雙下劃線結束。真假值,如果向量模為,返回實現向量加法實現向量乘法,例如返回向量的模返回歐幾里德范數找個例子運行下。怎么辦中有個特殊方法,可以修改控制臺輸出的樣式。 什么是特殊方法?當我們在設計一個類的時候,python中有一個用于初始化的方法$__init__$,類似于java中的構造器,這個就是特殊方法,也叫作魔術方法。簡單來說,特殊方法可以給你設計的...

    niceforbear 評論0 收藏0
  • python奇遇:迭代器和生成器

    摘要:來說說迭代器和生成器,還有可迭代對象和生成器表達式。有點繞是不是,其實,一般只要知道可迭代對象以及它是如何實現的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對象和生成器表達式。 之前簡單的提到過,一個對象是可迭代的可以理解為能夠使用for循環。這樣說其實不太準確,某個對象可迭代是因為它內部實現了$__iter__$這個特殊方法。比如在...

    atinosun 評論0 收藏0
  • python奇遇:隱藏的python功能

    摘要:先不講數據結構了,這次來說說中一些不被注意的功能。直接交換第二個功能。對的長度使用生成一個序列,然后遍歷或者這樣第三個功能。其實還接受第二個參數,它的作用是在迭代的過程中如果碰到第二個參數則停止。 先不講數據結構了,這次來說說python中一些不被注意的功能。 在python的設計哲學中,有這么一條內容:Simple is better than complex,簡單的代碼比復雜的要好...

    APICloud 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<