從5個維度總結Python數(shù)據(jù)結構的關系,發(fā)現(xiàn)了這些技巧
在python中,我們經常用列表,字典等數(shù)據(jù)類型進行數(shù)據(jù)存儲或者重新構造一個序列,同時它們之間也有著一些關聯(lián)關系,接下來我們就對python中常用的幾種數(shù)據(jù)類型進行一個整體性的梳理。

區(qū)別
相同點
- 都相當于一個容器,有存放數(shù)據(jù)的功能
- 都可以用for ... in 進行循環(huán)
不同點
- 序列存放的是不同類型的數(shù)據(jù),迭代器中存放的是算法。
- 序列是將數(shù)據(jù)提前存放好,獲取數(shù)據(jù)時通過循環(huán)或索引來取數(shù)據(jù) ;而迭代器不需要存放數(shù)據(jù),獲取數(shù)據(jù)時通過算法獲取下一個數(shù)據(jù) 。
- 序列中的每一個數(shù)據(jù)都要開辟內存空間;而迭代器并不需要,它每次只需要通過算法計算出下一個值即可。從這個角度來看,如果進行大數(shù)據(jù)量處理,使用迭代器更合適 。
- 序列可以通過索引或鍵名來獲取某一個值,而迭代器只能使用next()獲取下一個值。
變化趨勢

從左到右,可以試圖找一些規(guī)律 。
- 從對數(shù)據(jù)的排序來看,從左到右可以看出是無序的,有序的,有規(guī)則(也可以定義成有序的)
- 從對數(shù)據(jù)的操作靈活度來看,左邊的操作性更加靈活,可以進行增刪改查 ;右邊相對來說比較單一只能進行查詢 (注意:定義后的字符串就只能進行查詢,通過方法生成的字符串并不是原來的字符串了)。若想關注這些數(shù)據(jù)類型中的具體方法,可參考:python的5種數(shù)據(jù)結構,方法很多記不住嗎?全在這里了.
- 從定義數(shù)據(jù)類型的符號來看,也是遵循漢字的大-中-小-引 來實現(xiàn)的,如字典|集合是大括號,列表是中括號,元組是小括號,字符串為雙引號或單引號。
數(shù)據(jù)類型間的相互轉化
以上不同的數(shù)據(jù)類型,也可以實現(xiàn)兩者之間的相互轉化,轉化時只需要通過調用對應函數(shù)即可,如下圖

下圖是每種數(shù)據(jù)類型間的相互轉化及具體實例。

通過以上的表格可以看出,數(shù)據(jù)類型可以進行相互轉化,總結有以下幾點:
- 無論轉化為什么數(shù)據(jù)類型,都是通過關鍵字將具體的數(shù)據(jù)類型括起來,如元組轉化為列表:list(tuple)
- 轉化為字典時需要注意的是,必須每兩個數(shù)據(jù)為一組,用括號括起來,這樣才能正確的生成字典的鍵值對,如果是一個元素轉化時會報錯 。
- 轉化為字符串時需要注意的是,雖然通過str(data)可以轉化為字符串,但很多情況并非是我們想要的,我們更想要的是將序列中的元素組合起來變成一個字符串 ,如果想實現(xiàn)這樣的需求,就可以使用join()方法實現(xiàn)。
轉化為字典時必須要求是兩個元素組合成一個元組才能進行轉化 。那為了簡便我們可以使用zip()將兩個序列組成一個新的字典更加方便。
- # 通過zip將兩個列表合并為一個序列,然后再轉化為字典。
- lst1 = ['x','y','z'] #可以是一個列表,元組,集合
- lst2 = [123,234,345]
- print(dict(zip(lst1,lst2)))
- #輸出:
- {'x': 345, 'y': 234, 'z': 123}
通過str()進行轉化后的數(shù)據(jù)雖然變成了字符串,但是我們更想的是把序列中的元素結合起來變?yōu)樽址?。那么可以通過join()方法將其內的元素變?yōu)橄胍淖址?/p>
- #語法:
- "sep".join(seq)
- #實例:
- x = "".join({'a':123,'b':345})
- print("x:",x)
- y = ",".join(['java','python','c++'])
- print("y:",y)
- z = "_".join(("tuple","demo","01"))
- #輸出:
- x: ab
- y: java,python,c++
- z: tuple_demo_01
- #說明:
- sep為分隔符,seq序列
便捷式寫法-推導式
在以上的數(shù)據(jù)結構中,部分數(shù)據(jù)類型同樣支持推導式,推導式是可以將一個可迭代對象構建成新的可迭代對象的表達式結構體 。通過推導式可以快速實現(xiàn)出一個新的序列或生成器 ,也可以讓代碼更加優(yōu)雅和快捷 。
為了更加直觀,我們可以一張圖來總結不同數(shù)據(jù)類型所支持的推導式。我們只需要記住推導式的433.

字典推導式
- #語法:
- {<operation_key:operation_value> for key,value in dict condition }
- #實例:
- d = {'chinese': 88, 'math': 92, 'english': 93, 'history': 84}
- print("成績大于90分的科目:", {k: '優(yōu)秀' for k, v in d.items() if v >= 90})
- #輸出
- 成績大于90分的科目: {'math': '優(yōu)秀', 'english': '優(yōu)秀'}
- #說明:
- for循環(huán)后的表達式可以是條件表達式或者循環(huán)表達式,主要是進行篩選或嵌套循環(huán)
- 返回結果是一個根據(jù)表達式運算后生成出來的新字典 。
集合推導式:
- #語法:
- {<operation_key:x> for x in set condition }
- #實例
- s = {x**2 for x in [1, 2, 3]}
- print("集合s:",s)
- #輸出:
- 集合s: {1, 4, 9}
列表推導式
- #語法:
- [ operation(x) for x in list condition ]
- #實例
- print([random.randint(1,10)+x for x in range(0,10) if x % 2 == 0])
- #結果:
- [3, 3, 14, 15, 12]
- #說明:
- #對列表推導式常使用的幾種用法
- 用法1:[x for x in iterable ] #循環(huán)后直接打印
- 用法2:[x for x in iterable if condition(x) ] #對x的條件判斷
- 用法3:[operation(x) for x iterable if condition(x)] #對x條件判斷后,再對x進行運算
- 用法4: [operation(x,y) for x in iterable for y in iterable1] #嵌套循環(huán),對x,y進行運算
生成器推導式
- #語法:
- ( operation(x) for x in iterable condition )
- #實例
- print((random.randint(1,10)+x for x in range(0,10) if x % 2 == 0))
- #結果:
- <generator object <genexpr> at 0x02FDC420>
- #說明:
- 新生成的生成器可以使用for循環(huán),也可以next()獲取其下一個值
組合用法
以上數(shù)據(jù)結構除了可以作為容器使用,也可以它們結合起來使用,以用作其它用途 。比如可以用作條件語句。為了直觀,我們先寫一個簡單的if語句。
- score = 92
- if score >= 90:
- print('優(yōu)秀')
- else:
- print('良好')
- #輸出:優(yōu)秀
接下來,我們就通過以下這三種方式來重新定義條件語句。

第一種,使用()+[]來實現(xiàn)條件判斷
- #語法:
- (<return_false>, <return_true>)[condition_expression]
- #實例:
- score = 92
- print(('良好','優(yōu)秀')[ score >= 90 ])
- #結果:
- 優(yōu)秀
- #說明:
- 在[]中寫條件語句,在()中寫返回為真和返回為假的值。一定要注意順序,()在前,[]在后
第二種,使用{}+[]來實現(xiàn)條件判斷
- #語法:
- {True: <return_true>, False: <return_false>}[<condition_expression>]
- #實例:
- score = 92
- print({True:'優(yōu)秀',False:'良好'}[ score >= 90 ])
- #結果:
- 優(yōu)秀
- #說明:
- 在[]中寫條件語句,在()中寫返回為真和返回為假的值,一定要注意順序
第三種,對字符串進行條件判斷 ,需要用到eval方法。
- #語法:
- eval("字符串判斷語句")
- #實例
- print('優(yōu)秀' if eval("score >= 90") else '良好')
- #結果
- 優(yōu)秀




























