Python隨身聽基礎篇03-基本數據結構list和dict

介紹

本文是《Python隨身聽》基礎篇03的文字稿,基本數據結構list和dict。

《Python隨身聽》是由第8哥(De8ug)錄製的一檔Python節目。致力於帶給你全新的python學習和複習體驗,打造一門聽着就能學會python的空中課堂。

點擊鏈接,立即收聽。

list和dict,顧名思義,就是列表和字典,這是python中非常基礎的數據結構,也是非常重要且用途最廣的數據結構,所以我把它們放在數據結構的第一節來介紹。

列表list就是一串糖葫蘆

list是python的一種內置數據結構,你把它想象成一串糖葫蘆就好了。python提前設定好了list的特點和一些固定操作(或方法或函數),計算機知道該怎麼進行具體操作。

list用中括號表示,裏面的值用英文的逗號分開。

特點與操作

list有這麼幾個簡單的特點:

  • 長度不固定,就像糖葫蘆可以串8個,串10個,當然也有奸商可能就串6個,甚至4個
  • 類型不固定,糖葫蘆可以串山楂,黑棗,橘子等等,list裏面也可以放字符串,數字,列表等等
  • 可以修改,就好像製作糖葫蘆,你本來要串個山楂,結果串了個橘子,可以把對應的那個錯的修改了就好啦。

list可以做這樣的幾個操作:

  • append: 追加元素,相當於給糖葫蘆一個個的串山楂
  • +,extend: 多個列表相加, 相當於把兩串糖葫蘆連在一起
  • insert: 向指定位置插入一個值,假如要給糖葫蘆的第二個位置串一個黑棗
  • remove, pop: 移除某一個元素,糖葫蘆中間某個壞了,給剔除
  • a in list_b: 檢查某個元素是否存在,檢查一個純山楂的糖葫蘆裏是不是有黑棗
  • sort: 排序,這個糖葫蘆比較難辦,假裝要一串山楂從小到大排列的糖葫蘆吧!
  • [:]: 切片操作,假如你吃糖葫蘆時候,就喜歡吃第2個到第5個,該怎麼啃?

代碼演示

>>> help(list)

>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> hulu1 = ['zha','zha','zha','zha']
>>> hulu2 = [1,2,3,4,5,6,7]
>>> hulu3 = []
>>> hulu3 = hulu1+hulu2
>>> hulu3
['zha', 'zha', 'zha', 'zha', 1, 2, 3, 4, 5, 6, 7]
>>> hulu3.extend(hulu1)
>>> hulu3
['zha', 'zha', 'zha', 'zha', 1, 2, 3, 4, 5, 6, 7, 'zha', 'zha', 'zha', 'zha']
>>> hulu1.append('zao')
>>> hulu1.append('zao')
>>> hulu1.append('zao')
>>> hulu1
['zha', 'zha', 'zha', 'zha', 'zao', 'zao', 'zao']
>>> len(hulu1)
7
>>> len(hulu3)
15
>>> hulu1.insert(3, 'xxx')
>>> hulu1
['zha', 'zha', 'zha', 'xxx', 'zha', 'zao', 'zao', 'zao']
>>> hulu1.remove(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> hulu1.remove('xxx')
>>> hulu1
['zha', 'zha', 'zha', 'zha', 'zao', 'zao', 'zao']
>>> hulu1.pop()
'zao'
>>> hulu1
['zha', 'zha', 'zha', 'zha', 'zao', 'zao']
>>> hulu1.pop()
'zao'
>>> hulu1
['zha', 'zha', 'zha', 'zha', 'zao']
>>> hulu1.insert(2, 'yyy')
>>> hulu1
['zha', 'zha', 'yyy', 'zha', 'zha', 'zao']
>>> hulu1.pop(2)
'yyy'
>>> hulu1
['zha', 'zha', 'zha', 'zha', 'zao']
>>> y in hulu1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
>>> 'yyy' in hulu1
False
>>> 'zha' in hulu1
True
>>> hulu1
['zha', 'zha', 'zha', 'zha', 'zao']
>>> hulu1.sort()
>>> hulu1
['zao', 'zha', 'zha', 'zha', 'zha']
>>> s=[5,2,6,8,34,7,8]
>>> s.sort()
>>> s
[2, 5, 6, 7, 8, 8, 34]
>>> s=[5,2,6,8,34,7,8,'a1','b5', 'a6','b2','a3']
>>> s.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
>>> s
[2, 5, 6, 7, 8, 8, 34, 'a1', 'b5', 'a6', 'b2', 'a3']
>>> s=[5,2,6,8,34,7,8,'am','bw', 'af','bs','an']
>>> s.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
>>> s=['am','bw', 'af','bs','an']
>>> s.sort()
>>> s
['af', 'am', 'an', 'bs', 'bw']
>>> s[1]
'am'
>>> s[3]
'bs'
>>> s[3:]
['bs', 'bw']
>>> s[:2]
['af', 'am']
>>> s[:]
['af', 'am', 'an', 'bs', 'bw']
>>> s[::2]
['af', 'an', 'bw']
>>> s[::-1]
['bw', 'bs', 'an', 'am', 'af']
>>> s='asdfghjk'
>>> s[::-1]
'kjhgfdsa'
>>> s[:5]
'asdfg'
>>> s[3:]
'fghjk'
>>> s[::3]
'afj'
>>>

字典就是一本字典

python的dict這種數據結構可以直接理解爲字典,不管漢語字典還是英語詞典,給你一個詞,這個詞在python的字典裏叫做key,中文是鍵盤的鍵,用這個詞可以找到它相關的意思或者說具體內容,這個內容在python的字典裏,叫做key的值或者value,或簡單叫作v。

dict用大括號表示,裏面用英文的逗號分隔多個組,用冒號隔開每一組的key和v。

特點與操作

dict的特點:

  • key是不可變的,很簡單去理解,查單詞的時候,如果查到一半這個詞自己變了,那肯定查的就是別的詞兒了。這個key的類型可以是int,float,或是string。你可以理解用目錄的頁面編號去查找某一頁,或者用一個單詞去查她的意思。
  • 字典默認是無序的。因爲字典只是一堆kv的集合,相當於一個大書包,各種書隨便丟在裏面了。排序的問題以後再說。

dict的常用操作:

  • {'k':'v'}, dict(zip(list_k, list_v)): 創建方法(使用kv或者zip)
  • d['k'],d.get('k'): 獲取元素(直接中括號裏用k或get方法)
  • 'k' in d: 檢測k是否存在
  • d.keys(): 獲取所有的k
  • d.values(): 獲取所有的值
  • del d['k']: 刪除k
  • d1.update(d2): 更新值,同k被覆蓋

代碼演示

>>> help(dict) # 查看幫助,瀏覽全局

>>> dir(dict) # 查看有哪些方法
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
>>> d={'k':2,'x':"ttt"} # 用大括號建立字典
>>> d
{'x': 'ttt', 'k': 2}
>>> list_k=[1,2,'n']
>>> list_v=['hello','python','de8ug']
>>> d=dict(zip(list_k, list_v)) # 用zip和kv的列表建立字典
>>> d
{1: 'hello', 2: 'python', 'n': 'de8ug'}
>>> d['1'] # 用不存在的k會報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: '1'
>>> d[1]
'hello'
>>> d['n']
'de8ug'
>>> d['n'] = 'nb' # 更新key的值
>>> d
{1: 'hello', 2: 'python', 'n': 'nb'} 
>>> d.get('n') # 用get獲取
'nb'
>>> d.get('m') # 沒有k的時候爲空
>>> d.get('m', 'yyy') # 取不到時候設置默認的值
'yyy'
>>> 'm' in d # 判斷是否存在k
False
>>> 'n' in d
True
>>> del d['n'] # 刪除k
>>> d
{1: 'hello', 2: 'python'}
>>> d['k']='tttt' # 直接添加k和v到字典,k之前可不存在
>>> d
{1: 'hello', 2: 'python', 'k': 'tttt'}
>>> d.keys # keys是方法,調用要加括號
<built-in method keys of dict object at 0x102401d48>
>>> d.keys()
dict_keys([1, 2, 'k'])
>>> d.values()
dict_values(['hello', 'python', 'tttt'])
>>> d2={}
>>> d2[2]='sdfsdf'
>>> d2[k2]="yyyy" # 注意k的取值,一半數字或字符串,否則報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'k2' is not defined
>>> d2[4]='sdfsdf'
>>> d2
{2: 'sdfsdf', 4: 'sdfsdf'}
>>> d2["k2"]="yyyy"
>>> d2
{2: 'sdfsdf', 4: 'sdfsdf', 'k2': 'yyyy'}
>>> d
{1: 'hello', 2: 'python', 'k': 'tttt'}
>>> d.update(d2) # 更新,相同的k會被覆蓋
>>> d
{1: 'hello', 2: 'sdfsdf', 4: 'sdfsdf', 'k': 'tttt', 'k2': 'yyyy'}

總結

今天,主要介紹的字典和列表的概念和使用。上面的示例是遠遠不夠的,需要多加練習,並且多用help去查看dir出來的你不認得的使用方法。

下一期會介紹:元組tuple和集合set,敬請關注!如果覺得本系列音頻對你的學習有幫助,請點個贊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章