1. 程式人生 > >列表、字典、元組進階

列表、字典、元組進階

eve 一個 多次 keys erro 自身 切片 字典 使用

  列表、字典和元組是python中所有腳本的主要工作組件。

列表

  列表中可包含任意種類的對象。和字符串一樣,他也支持序列的常規操作,指定偏移值和切片、合並以及叠代等序列操作。

  與其他語言不同的是列表是一種高階的序列操作工具,python中的列表可以完成大多數幾何體數據結構的工作。

  列表的主要屬性:

  1.任意對象的有序集合:列表中收集任何python對象並且保持了從左往右的位置順序;

  2.通過偏移量讀取;

  3.可變長度、異構和任意長度:列表是可變數據類型,支持原處修改,其中元素可以是任意數據類型,包括列表字典。

  4.對象引用:python總是會存儲對象的引用而不是對象的copy。

  :我們在學習時註重精通常量語法,但是現實生產中python的多數據結構都是建立在運行執行程序代碼時。

  列表的常規操作:

a=[1,2,a]
b=[a,s,d]
print(a+b)
print(a*2)
運行結果:
[1, 2, a, a, s, d]
[1, 2, a, 1, 2, a]

  列表的叠代與解析:

for i in a:
    print(i**2)
運行結果:
1
4
9
a=[1,2,3]
print(i**2 for i in a)
print(list(i**2 for i in a))
運行結果:
<generator object <genexpr> at 0x00000000027EBB40>
[
1, 4, 9]
a=[-1,2,3]
print(list(map(abs, a)))
運行結果:
[1, 2, 3]

  由於列表多次嵌套,所以有時需要多次索引才能深入到數據結構中。

a=[[1,2,3],
   [4,5,6],
   [7,8,9]]
print(a[2][1])
運行結果:
8

  切片賦值時被賦值序列長度可以與我們復制的序列長度不相同,故可以用此操作進行替換,插入,縮短主列表。並且賦值的值與切片重合也是切實可行的。例:a[2:5]=a[3:7]。

  列表的常用方法:

  append():與a+[x]不同的是,方法原地修改列表,而+會產生新的列表。所以append方法執行更快。

a=[1,2,3]
a.append(4)
print(a)
運行結果:
[1, 2, 3, 4]

  sort():可以給定配置選項,name=value來定義。

a=[aBC,abd,Abe]
a.sort()
print(a)
a.sort(key=str.upper,reverse=True)
print(a)
運行結果:
[Abe, aBC, abd]
[Abe, abd, aBC]

  :在python2中比較時int總比str小,比較運算並不會自動轉換類型,到了python3以後類型之間有了明確的界限,[1,2,‘a‘]這用列表已經不可以用sort方法排序了。

a=[aBC,abd,Abe]
print(sorted(a))
運行結果:
[Abe, aBC, abd]

  其他常用方法:

a=[aBC,abd,Abe]
a.extend([a])
print(a)
運行結果:
[aBC, abd, Abe, a]
a=[aBC,abd,Abe]
a.pop()
print(a)
運行結果:
[aBC, abd]
a=[aBC,abd,Abe]
a.reverse()
print(a)
print(list(reversed(a)))
運行結果:
[Abe, abd, aBC]
[aBC, abd, Abe]
a=[aBC,abd,Abe]
a.insert(0,a)
print(a)
print(a.index(a))
a.remove(a)
print(a)
print(a.pop(1))
運行結果:
[a, aBC, abd, Abe]
0
[aBC, abd, Abe]
abd

  註:a[i:j]=[]可以做到刪除,但是a[i]=[]只會將此索引位置改為空列表。

字典:

  字典是一種無序的集合,是靠key來取值的序列。字典可以非常快速的進行一些其他語言的搜索算法和數據結構。

  字典的主要屬性:

  1.通過key而不是偏移量取值:字典有自己的hash表,通過鍵來取值。

  2.任意對象無需集合:字典並沒有特定的順序,實際上key提供了象征性的位置作用。

  3.與列表一樣字典可變長、異構、任意嵌套。

  4.屬於可變映射類型。

  5.對象引用表:采用最優化的散列算法來尋找key,搜索速度極快,並且與列表一樣存儲對象是引用而不是拷貝。

  字典的常用操作:

a={name:jeff,age:111}
print(list(a.keys()))
運行結果:
[name, age]
a={name:jeff,age:111}
print(name in a)
運行結果:
Ture
a={name:jeff,age:111}
a[name]=frank
print(a)
運行結果:
{name: frank, age: 111}
a={name:jeff,age:111}
a[like]=game
print(a)
運行結果:
{name: jeff, like: game, age: 111}
a={name:jeff,age:111}
a[like]=game
del a[like]
print(a)
運行結果:
{age: 111, name: jeff}

  字典常用方法:

a={name:jeff,age:111}
print(list(a.values()))
print(list(a.items()))
運行結果:
[jeff, 111]
[(name, jeff), (age, 111)]

  get():檢查key是否在,並返回某個值,默認None。

a={name:jeff,age:111}
print(a.get(name,no))
print(a.get(like,no))
運行結果:
jeff
no

  update():更新沒有的,並且盲目覆蓋已有的值。

a={‘name‘:‘jeff‘,‘age‘:‘111‘}
a.update({‘like‘:‘game‘})
print(a)
運行結果:
{‘name‘: ‘jeff‘, ‘like‘: ‘game‘, ‘age‘: ‘111‘}

  pop():

a={‘name‘:‘jeff‘,‘age‘:‘111‘}
a.pop(‘age‘)
print(a)
運行結果:
{‘name‘: ‘jeff‘}

  :字典的鍵不一定都是字符串,當然不可能是列表啦,字典的鍵可以是任何不可變對象。

  小技巧:制作一個字典讓他用起來很像一個列表。

a={0:jeff,1:111}
print(a[0])
運行結果:
jeff

  值得一提的是讀取不存在的鍵時常會報錯,而在一些場景我們並不希望報錯,我們可以采取以下三種方式進行避免:

  1.if先對鍵進行判斷再使用。

a={0:jeff,1:111}
if 2 in a:
    print(a[0])
else:
    print(none)
運行結果:
none

  2.try語句修復

a={0:jeff,1:111}
try:
    print(a[2])
except KeyError:
    print(none)
運行結果:
none

  3.get()

a={0:jeff,1:111}
print(a.get(2,none))
運行結果:
none

  字典取代了搜索數據結構,在嵌套時輕松表達結構化信息。

  :字典接口適用於python各種內置工具。

  字典的4中創建方法:

a={0:jeff,1:111}
print(a)
運行結果:
{0: jeff, 1: 111}
a={}
a[name]=jeff
print(a)
運行結果:
{name: jeff}
a=dict(name=jeff)
print(a)
運行結果:
{name: jeff}
a=dict([(name,jeff)])
print(a)
運行結果:
{name: jeff}

  如果事先就能拼出整個字典,就使用第一種創建方式,如果需要動態創建字典的某個字段則使用第二種方式,第三種方式的key必須是字符串,第四種方式需要在運行時把key好的value逐步建成序列。

  python3中字典做出了哪些改變:

  1.支持字典解析表達式;

  2.調用a.keys、a.values、a.items方法需要使用list使其可視化;

  3.不再支持大小比較,相等性測試依然存在;

  4.取消has_key方法,只使用in判斷成員關系,當然get方法也是可行的。

  字典解析:

a={k:v for (k,v) in zip([1,2,3],[a,s,d])}
print(a)
運行結果:
{1: a, 2: s, 3: d}

  keys,values,items返回的都是可叠代視圖對象,如果想用列表操作或者顯示他們的值,必須通過內置函數list來完成。當然這種試圖既然是可叠代對象,我們還可以使用for循環叠代查看。此外遍歷key的方法直接使用for i in {}即可,不一定要是用key方法。並且python3可以動態反映在視圖創建對象後對字典做出的修改。

  :python2keys不會反回一個列表,所以python2需要通過排序鍵來瀏覽一個字典的編碼模式。

  小練習:創建字典,所有鍵的value都是0。

a={‘a‘:0,‘b‘:0...}
print(a)
a={}
a[a]=0
a[b]=0
.
.
.
print(a)
a=dict(a=0,b=0...)
print(a)
a=dict([(a,0),(b,0)...])
print(a)
a=dict.fromkeys([a,b...],0)
print(a)
a={k:0 for k in ab...}
print(a)

元組

  元組基本屬性:

  1.任意對象有序集合:這點與列表一致;

  2.通過偏移存取;

  3.固定長度、異構任意嵌套:因為元組是不可變序列類型;

  4.引用對象而非copy。

  元組和其他兩種序列不同的是他沒有方法,還是因為他的不可變性,可能根本就不需要什麽方法吧。

  這裏值得註意的是定義只有單個元素的元組的情況:

a=(a)
b=(a,)
print(a)
print(b)
運行結果:
a
(a,)

  在python裏,括號在大所屬情況下是可以忽略的,僅當元組作為常量穿個函數調用和元組在python2中print語句中列出時才必不可少。對於初學者可能對概念模糊不清,所以建議當前還是使用括號更好。

  如果想要操作元組,可以將其轉化為倆表對象進行操作,然後再轉化為元組,在進行排序的操作時可以使用sorted函數來完成,此函數接受任何序列對象。

  列表解析可以用於元組轉換,列表解析甚至可以用在某些並非實際存儲的序列之上,任何遍歷對象都可以,包括逐行讀取文件。

  註:元組也不是完全沒有方法,index和count在元組中也是可以工作的。並且元組的不可變性只是本身,不包括它內部的元素,如果元組的內部是列表元素,那他依然可以進行修改列表。

其他python對象及類型

  篇幅有限簡單介紹一下python的其他類型。

  None對象

  python特殊數據類型的唯一值,一般都起到一個空的占位作用。None不意味著無意義,None是某些內容,盡管是沒有意義的意思,但是他是一個真正的對象,並且他有一塊內存存放,python給定一個內置的名稱。他還是函數的返回值。

  bool類型

  當明確地用在真值測試,真假就是1和0.交互模式下進行布爾測試結果也是打印成Ture與False。python內置函數bool()用於測試對象的真假。

  type對象

  即使是類型本身在python中也是有對象的。

print(type(type))
運行結果:
<class type>

  python還定義了isinstance來作為類型判斷內置函數。

  :最後一點復合對象指向自身的引用,成為循環,python在對象中檢測到循環就會打印成[...]而不會陷入無限的循環。

l=[1,2,3]
l.append(l)
print(l)
運行結果:
[1, 2, 3, [...]]

  除了這些核心對象以外,還有函數,模塊和類的內核心數據類型,在之後的學習過程中,一一分享給大家。

列表、字典、元組進階