主題

從零開始的python ep.6 序對 串列 字典(還有集合)的處理

黑子 | 2021-04-03 18:00:04 | 巴幣 2 | 人氣 67

如上篇所述,本篇是容器的處理方法
tuple  序對   list 串列  dict 字典  set 集合
進入方法前,先介紹生成式,推導式(主要用於list)
來看看輸出結果

生成式跟推導式概念一致,下面在資料篩選中會繼續說明
推導式好處多多,省去對齊的麻煩,還不用指定一個空的list

這邊活用append跟while迴圈的功能,讓使用者輸入檔案名稱,然後到-1結束
從中篩選出txt跟py檔,利用生成式將if迴圈簡化,不然本來要打成
for t in st:
if t.endswith(".txt"):
print("T00_"+t.capitalize())

capitalize() 將篩選出的字串首字大寫,用rsplit(".",1)從右邊進行分割,[0]代表取分割從左邊數來第一個字串,並在結尾處加上"txt"或"py",不過我後來發現txt的只有首字大寫,所以不用rsplit,只有全部都要大寫的upper()才要用,所以輸出結果如下


但T00跟P00很醜,幫它編個號,可以用if迴圈,但這邊涉及多個變數,所以 enumerate 就上場了
(有字串內容跟位置,所以要用位置跟 x[index]來呈現哪個位置是哪個元素 )

來看看輸出結果

所以把enumerate活用一下,可以把資料篩選變成下面新的生成式

來看看結果



然後來介紹 tuple list  dict set 他們的屬性以及方法
tuple因為它很傲嬌的關係,所以它只有兩個方法能用
分別是count 跟 index,但是不能指定範圍(沒辦法像字串一樣用end或star)

再來是list 超級好用
以下列出常用方法
有些方法沒有回傳值,因為沒有改變容器的內容(沒有新增或移除),單純的排序或是增加是沒有回傳值的
(因為直接改完然後存在list裡面)
而字串中,幾乎都有回傳值是因為我們使用的方法必定會影響字串的內容

list[i]=任意元素
可以直接取代掉該位置[i]的元素,使用方式如下(C是我先寫好的list)

list.index(i,n)
index其名為索引,跟字串的find 大同小異(幫你找到該值的所在位置),括號內的i值必填,而且i必須要在list中,範例如下
st=[1,2,3,44,5]
i=st.index(5)
print(i)
此時我就會得到i值為4,也是容器中少數有回傳值的方法
然後n可以做為範圍調整,跟find使用方式一樣
1在0,3,7位置出現,所以更動n就能得到後面出現1的位置




list.append()
用於將東西直接放進list中(不限定數字,字串,容器等等,缺點就是原封不動的放進去),依序從0開始往後放,想放的東西就寫在()內,同樣沒有回傳值


list.extend()
可以將不同的容器合併在一個list中,並放在list的最後 (它會把容器內的東西取出來再放進list裡面)
如果覺得extend太多字
可以直接用list=list1+list2

list.remove(value)
如其名,可以把list中 "第一個"  符合的value刪除

list.insert(index,object)
可以把object插入list指定的index(位置,老慣例從0開始),可說是append的進階版,但是盡可能用append為主


list.pop()
會把list中最後一個東西印出來然後丟出list,少數有回傳值的方法
舉例(用for迴圈讓它重複丟出來)
n= ['Apple','Ball','Cake','Doll','Ella','Fish']
for i in range(len(n)):
    print(n.pop())
    print(n)
來看看結果
就是這樣的使用方式

list.sort([key=none],[reverse=False])
()內可以不填東西,沒有回傳值,所以不能用n=list.sort(),這是常見錯誤寫法,n會顯示none
.sort()下去,會進行排序,然後儲存,也就是list就變成排序好的了
key可以做排序依據,reverse是參數跟list.reverse()是不同的,這跟深層資料結構有關,當list有相同字元會造成排序不穩定,只要把reverse=True 就會變成由大排到小
如果是字串排序,是比較unicode的大小

然後是上面提到的錯誤寫法

list.reverse()
()內不用填東西,沒有回傳值,所以不能用n=list.reverse(),原因同上

list.copy()
()內不用填入參數,會有回傳值,通常用來複製一份做為修改時的範本(避免改動的原本的list)



tuple list  之後進入字典 dict 的部分
字典不同於list 或tuple 有許多寫法
d1 = {1: 'a', 2: 'b'}
d2 = dict({1: 'a', 2: 'b'})     #官方推薦寫法,但還要多打dict很可笑
d3 = dict(zip((1, 2), ( 'a', 'b')))   #這裡多用了zip這個函式
d4 = dict([[2, 'b'], [1, 'a']])
以上寫法都是1對應a,2對應b

zip的寫法也可以這樣寫
a=(1,2,3)
b=("我","不","要")
z1=zip(a,b)
print(dict(z1))  可以得到 >>>  {1: '我', 2: '不', 3: '要'}

來作個練習,分別將關鍵字(key),轉成對應的字
key=("JK","JS","JC","sunspots","pick")
value=("女高中生","女子小學生","女中學生","黑子","撿")
short=dict(zip(key,value))    #short 是轉換的字典,這邊用到dict

來看看輸入跟輸出的變化


然後,如果想要print 出字典特定值,可用if  (也可避免一些使用者隨意輸入產生的錯誤),舉例如下
n=input()
Z1={"A":"我","B":"你","C":"他","D":"她"}
if n in Z1:
    print(Z1[n])
else:
    print("輸入不存在")
當我輸入ABCD之外的值,就會跳出輸入不存在,輸入正確值,就會print出字典對應的value


接著介紹dict的方法
d[x]
讓使用者可以得到x (key)在d這個字典中 對應的值(value)
(其實就跟list裡面的index一樣,只是字典是輸入key,list是特定位置),如果x值不在d字典的key值中,會跳出錯誤

dict.get(key,default)
使用方式同上,如果key不在字典中不會跳錯誤,只會回傳none
可以使用下方例子做新增
d['work']=d.get('work',0)+1      #d是一個字典,賦予它的"work"(key) 對應 get預設值為0,然後加一
此時d就會多出 "work":1 新的對應元素,但是,這邊只能用數字不能用字串

d[x]=y
令字典的x對應到y,這是字典專屬的指定修改方法,也可用於新增(比上面的get 好用)

del d[x]
如其名將字典中的x刪掉(包含x對應的值)

dict.clear()
清除字典中的內容

dict.keys()
回傳字典中所有的key

dict.values()
回傳字典中所有values

有些時候,我們希望dict的內容可以按照特定順序,例如數字大小或字母
所以可以先將dict中的key做排序,然後用這個排序去獲得對應的value (舉例如下)

我先指定一個字典Z1,然後L這個list是排序過後的key,結合生成式的用法,讓V可以得到從L中對應Z1的值 (有點繞口令的感覺...)
之後的章節會學到 函數 ,可以將 "排序後得到輸出" 設成一個函數,這樣可以節省很多時間



最後是set 集合
本來想獨立出來,因為原本預定的篇幅只有到dict,但為了方便整理,還是把set放在這裡
set 通常用來處理一堆資料中有 交集 聯集或差集的部分,所以它的方法就是圍繞這個集合的概念所產生
set是沒有順序的資料

set.add(e)
把元素e放入集合中

set.pop()
跟 list 的pop類似,但是set是隨意回傳一筆,然後把這筆資料從set中刪除

set.remove(e) 跟  set.discard(e)
remove跟discard都可以執行將e元素從set中刪除,但e必須要在set中,如果e不在set中,會發生有趣的事,remove會回傳 KeyError,而 discard則不會做任何回傳(當作沒發生過)

set.difference(set2) 或是 set - set2()  (差集)
比較set跟set2的差異,並且會回傳一個新的set (因為set放在前面,所以會得到set中不在set2的元素)

set.intersection(set2) 或是 set & set2()  (交集)
比較set 跟set2 相同的部分,並且會回傳一個新的set

set.union(set2) 或是 set | set2() (聯集)
把set 跟set2 涵蓋的部分全部整理出來,並且會回傳一個新的set

set.symmetric_difference (set2) 或是 set^set2()  互斥(異)
把set 跟set2 進行互異運算,並回傳一個新的 set (就是排除兩個set中交集的部分)

上面講那麼多大家可能還是不能吸收,實際使用一次給你們看
▲黃色是B店,灰色是A店,藍色是兩間店都有賣的水果


除了上述介紹的方法,有時候我們會想轉換容器內中元素的形式,例如想把字串轉成數字,可以用
list(map(int,st)) 跟 [int(i) for i in st]
使用舉例
list跟dict都可以,set跟tuple同理 (當然dict的部分只有取出key值,這似乎能代替dict.keys()....嗎?答案是不行,如果key有字母在裡面就會error,因為不能int)

當然這個轉換不能用在容器內的容器




補充連結



送禮物贊助創作者 !
0
留言

創作回應

相關創作

更多創作