串列
串列是 Python 中使用最頻繁的資料型別,它可以完成大多數集合類的資料結構實作,可以包含不同型別的元素,包括數字、字串,甚至串列(也就是所謂的嵌套),
和字串一樣,可以通過索引值或者切片(截取)進行訪問元素,索引也是從 0 開始,而如果是倒序,則是從 -1 開始,串列截取的示意圖如下所示:
另外,還可以添加第三個引數作為步長:
同樣,串列也有很多內置的方法,這里介紹一些常見的方法:
- len(list):回傳串列的長度
- append(obj) / insert(index, obj) / extend(seq):增加元素的幾個方法
- pop() / remove(obj) / del list[index] / clear():洗掉元素
- reverse() / reversed:反轉串列
- sort() / sorted(list):對串列排序,注意前者會修改串列內容,后者回傳一個新的串列物件,不改變原始串列
- index():查找給定元素第一次出現的索引位置
初始化串列的代碼示例如下:
# 創建空串列,兩種方法
list1 = list()
list2 = []# 初始化帶有資料
list3 = [1, 2, 3]
list4 = ['a', 2, 'nb', [1, 3, 4]]
print('list1:', list1)
print('list2:', list2)
print('list3:', list3)
print('list4:', list4)
print('len(list4): ', len(list4))
添加元素的代碼示例如下:
# 末尾添加元素
list1.append('abc')
print('list1:', list1)# 末尾添加另一個串列,并合并為一個串列
list1.extend(list3)
print('list1.extend(list3), list1:', list1)
list1.extend((1, 3))
print('list1.extend((1,3)), list1:', list1)# 通過 += 添加元素
list2 += [1, 2, 3]
print('list2:', list2)
list2 += list4
print('list2:', list2)# 在指定位置添加元素,原始位置元素右移一位
list3.insert(0, 'a')
print('list3:', list3)# 末尾位置添加,原來末尾元素依然保持在末尾
list3.insert(-1, 'b')
print('list3:', list3)
洗掉元素的代碼示例如下:
# del 洗掉指定位置元素del list3[-1]
print('del list3[-1], list3:', list3)# pop 洗掉元素
pop_el = list3.pop()
print('list3:', list3)
print('pop element:', pop_el)# pop 洗掉指定位置元素
pop_el2 = list3.pop(0)
print('list3:', list3)
print('pop element:', pop_el2)# remove 根據值洗掉元素
list3.remove(1)
print('list3:', list3)# clear 清空串列
list3.clear()
print('clear list3:', list3)
查找元素和修改、訪問元素的代碼示例如下:
# index 根據數值查詢索引
ind = list1.index(3)
print('list1.index(3),index=', ind)# 訪問串列第一個元素
print('list1[0]: ', list1[0])# 訪問串列最后一個元素
print('list1[-1]: ', list1[-1])# 訪問第一個到第三個元素
print('list1[:3]: ', list1[:3])# 訪問第一個到第三個元素,步長為2
print('list1[:3:2]: ', list1[:3:2])# 復制串列
new_list = list1[:]
print('copy list1, new_list:', new_list)
排序的代碼示例如下:
list5 = [3, 1, 4, 2, 5]
print('list5:', list5)# use sorted
list6 = sorted(list5)
print('list6=sorted(list5), list5={}, list6={}'.format(list5, list6))# use list.sort()
list5.sort()
print('list5.sort(), list5: ', list5)
sorted() 都不會改變串列本身的順序,只是對串列臨時排序,并回傳一個新的串列物件;
相反,串列本身的 sort() 會永久性改變串列本身的順序,
另外,如果串列元素不是單純的數值型別,如整數或者浮點數,而是字串、串列、字典或者元組,那么還可以自定義排序規則,這也就是定義中最后兩行,例子如下:
# 串列元素也是串列
list8 = [[4, 3], [5, 2], [1, 1]]
list9 = sorted(list8)
print('list9 = sorted(list8), list9=', list9)# sorted by the second element
list10 = sorted(list8, key=lambda x: x[1])
print('list10 = sorted(list8, key=lambda x:x[1]), list10=', list10)
list11 = sorted(list8, key=lambda x: (x[1], x[0]))
print('list11 = sorted(list8, key=lambda x:(x[1],x[0])), list11=', list11)# 串列元素是字串
list_str = ['abc', 'pat', 'cda', 'nba']
list_str_1 = sorted(list_str)
print('list_str_1 = sorted(list_str), list_str_1=', list_str_1)# 根據第二個元素排列
list_str_2 = sorted(list_str, key=lambda x: x[1])
print('list_str_2 = sorted(list_str, key=lambda x: x[1]), list_str_2=', list_str_2)# 先根據第三個元素,再根據第一個元素排列
list_str_3 = sorted(list_str, key=lambda x: (x[2], x[0]))
print('list_str_3 = sorted(list_str, key=lambda x: (x[2], x[0])), list_str_3=', list_str_3)
反轉串列的代碼示例如下:
# 反轉串列
list5.reverse()
print('list5.reverse(), list5: ', list5)
list7 = reversed(list5)
print('list7=reversed(list5), list5={}, list7={}'.format(list5, list7))#for val in list7:# print(val)# 注意不能同時兩次
list7_val = [val for val in list7]
print('采用串列推導式, list7_val=', list7_val)
list8 = list5[::-1]
print('list5 = {}\nlist_reversed = list5[::-1], list_reversed = {}'.format(list5, list_reversed))
reverse() 方法會永久改變串列本身,而 reversed() 不會改變串列物件,它回傳的是一個迭代物件,如例子輸出的 <list_reverseiterator object at 0x000001D0A17C5550> , 要獲取其排序后的結果,需要通過 for 回圈,或者串列推導式,但需要注意,它僅僅在第一次遍歷時候回傳數值,
以及,一個小小的技巧,利用切片實作反轉,即 <list> = <list>[::-1],
元組
元組和串列比較相似,不同之處是元組不能修改,然后元組是寫在小括號 () 里的,
元組也可以包含不同的元素型別,簡單的代碼示例如下:
t1 = tuple()
t2 = ()
t3 = (1, 2, '2', [1, 2], 5)# 創建一個元素的元祖
t4 = (7, )
t5 = (2)
print('創建兩個空元組:t1={}, t2={}'.format(t1, t2))
print('包含不同元素型別的元組:t3={}'.format(t3))
print('包含一個元素的元祖: t4=(7, )={}, t5=(2)={}'.format(t4, t5))
print('type(t4)={}, type(t5)={}'.format(type(t4), type(t5)))
print('輸出元組的第一個元素:{}'.format(t3[0]))
print('輸出元組的第二個到第四個元素:{}'.format(t3[1:4]))
print('輸出元祖的最后一個元素: {}'.format(t3[-1]))
print('輸出元祖兩次: {}'.format(t3 * 2))
print('連接元祖: {}'.format(t3 + t4))
元祖和字串也是類似,索引從 0 開始,-1 是末尾開始的位置,可以將字串看作一種特殊的元組,
此外,從上述代碼示例可以看到有個特殊的例子,創建一個元素的時候,必須在元素后面添加逗號,即如下所示:
tup1 = (2,) # 輸出為 (2,)
tup2 = (2) # 輸出是 2
print('type(tup1)={}'.format(type(tup1))) # 輸出是 <class 'tuple'>
print('type(tup2)={}'.format(type(tup2))) # 輸出是 <class 'int'>
還可以創建一個二維元組,代碼例子如下:
# 創建一個二維元組
tups = (1, 3, 4), ('1', 'abc')
print('二維元組: {}'.format(tups)) # 二維元組: ((1, 3, 4), ('1', 'abc'))
然后對于函式的回傳值,如果回傳多個,實際上就是回傳一個元組,代碼例子如下:
def print_tup():
return 1, '2'
res = print_tup()
print('type(res)={}, res={}'.format(type(res), res)) # type(res)=<class 'tuple'>, res=(1, '2')
元組不可修改,但如果元素可修改,那可以修改該元素內容,代碼例子如下所示:
tup11 = (1, [1, 3], '2')
print('tup1={}'.format(tup11)) # tup1=(1, [1, 3], '2')
tup11[1].append('123')
print('修改tup11[1]后,tup11={}'.format(tup11)) # 修改tup11[1]后,tup11=(1, [1, 3, '123'], '2')
因為元組不可修改,所以僅有以下兩個方法:
- count(): 計算某個元素出現的次數
- index(): 尋找某個元素第一次出現的索引位置
代碼例子:
# count()
print('tup11.count(1)={}'.format(tup11.count(1)))# index()
print('tup11.index(\'2\')={}'.format(tup11.index('2')))
字典
字典也是 Python 中非常常用的資料型別,具有以下特點:
- 它是一種映射型別,用 {} 標識,是無序的 鍵(key): 值(value) 的集合;
- 鍵(key) 必須使用不可變型別;
- 同一個字典中,鍵必須是唯一的;
創建字典的代碼示例如下,總共有三種方法:
# {} 形式
dic1 = {'name': 'python', 'age': 20}# 內置方法 dict()
dic2 = dict(name='p', age=3)# 字典推導式
dic3 = {x: x**2 for x in {2, 4, 6}}
print('dic1={}'.format(dic1)) # dic1={'age': 20, 'name': 'python'}
print('dic2={}'.format(dic2)) # dic2={'age': 3, 'name': 'p'}
print('dic3={}'.format(dic3)) # dic3={2: 4, 4: 16, 6: 36}
常見的三個內置方法,keys(), values(), items() 分別表示鍵、值、對,例子如下:
print('keys()方法,dic1.keys()={}'.format(dic1.keys()))print('values()方法, dic1.values()={}'.format(dic1.values()))print('items()方法, dic1.items()={}'.format(dic1.items()))
其他對字典的操作,包括增刪查改,如下所示:
# 修改和訪問
dic1['age'] = 33
dic1.setdefault('sex', 'male')
print('dic1={}'.format(dic1))# get() 訪問某個鍵
print('dic1.get(\'age\', 11)={}'.format(dic1.get('age', 11)))
print('訪問某個不存在的鍵,dic1.get(\'score\', 100)={}'.format(dic1.get('score', 100)))# 洗掉del dic1['sex']
print('del dic1[\'sex\'], dic1={}'.format(dic1))
dic1.pop('age')
print('dic1.pop(\'age\'), dic1={}'.format(dic1))# 清空
dic1.clear()
print('dic1.clear(), dic1={}'.format(dic1))# 合并兩個字典
print('合并 dic2 和 dic3 前, dic2={}, dic3={}'.format(dic2, dic3))
dic2.update(dic3)
print('合并后,dic2={}'.format(dic2))
# 遍歷字典
dic4 = {'a': 1, 'b': 2}for key, val in dic4.items():
print('{}: {}'.format(key, val))# 不需要采用 keys()for key in dic4:
print('{}: {}'.format(key, dic4[key]))
最后,因為字典的鍵必須是不可改變的資料型別,那么如何快速判斷一個資料型別是否可以更改呢?有以下兩種方法:
- id():判斷變數更改前后的 id,如果一樣表示可以更改,不一樣表示不可更改,
- hash():如果不報錯,表示可以被哈希,就表示不可更改;否則就是可以更改,
首先看下 id() 方法,在一個整型變數上的使用結果:
i = 2
print('i id value='https://www.cnblogs.com/Mrzhangzong/p/, id(i))
i += 3
print('i id value='https://www.cnblogs.com/Mrzhangzong/p/, id(i))
輸出結果,更改前后 id 是更改了,表明整型變數是不可更改的,
i id value= https://www.cnblogs.com/Mrzhangzong/p/1758265872
i id value= https://www.cnblogs.com/Mrzhangzong/p/1758265968
然后在串列變數上進行同樣的操作:
l1 = [1, 3]
print('l1 id value='https://www.cnblogs.com/Mrzhangzong/p/, id(l1))
l1.append(4)
print('l1 id value='https://www.cnblogs.com/Mrzhangzong/p/, id(l1))
輸出結果,id 并沒有改變,說明串列是可以更改的,
l1 id value= https://www.cnblogs.com/Mrzhangzong/p/1610679318408
l1 id value= https://www.cnblogs.com/Mrzhangzong/p/1610679318408
然后就是采用 hash() 的代碼例子:
# hash
s = 'abc'
print('s hash value: ', hash(s))
l2 = ['321', 1]
print('l2 hash value: ', hash(l2))
輸出結果如下,對于字串成功輸出哈希值,而串列則報錯 TypeError: unhashable type: 'list',這也說明了字串不可更改,而串列可以更改,
s hash value: 1106005493183980421
TypeError: unhashable type: 'list'
集合
集合是一個無序的不重復元素序列,采用大括號 {} 或者 set() 創建,但空集合必須使用 set() ,因為 {} 創建的是空字典,
創建的代碼示例如下:
# 創建集合
s1 = {'a', 'b', 'c'}
s2 = set()
s3 = set('abc')
print('s1={}'.format(s1)) # s1={'b', 'a', 'c'}
print('s2={}'.format(s2)) # s2=set()
print('s3={}'.format(s3)) # s3={'b', 'a', 'c'}
注意上述輸出的時候,每次運行順序都可能不同,這是集合的無序性的原因,
利用集合可以去除重復的元素,如下所示:
s4 = set('good')
print('s4={}'.format(s4)) # s4={'g', 'o', 'd'}
集合也可以進行增加和洗掉元素的操作,代碼如下所示:
# 增加元素,add() 和 update()
s1.add('dd')
print('s1.add(\'dd\'), s1={}'.format(s1)) # s1.add('dd'), s1={'dd', 'b', 'a', 'c'}
s1.update('o')
print('添加一個元素,s1={}'.format(s1)) # 添加一個元素,s1={'dd', 'o', 'b', 'a', 'c'}
s1.update(['n', 1])
print('添加多個元素, s1={}'.format(s1)) # 添加多個元素, s1={1, 'o', 'n', 'a', 'dd', 'b', 'c'}
s1.update([12, 33], {'ab', 'cd'})
print('添加串列和集合, s1={}'.format(s1)) # 添加串列和集合, s1={1, 33, 'o', 'n', 'a', 12, 'ab', 'dd', 'cd', 'b', 'c'}
# 洗掉元素, pop(), remove(), clear()
print('s3={}'.format(s3)) # s3={'b', 'a', 'c'}
s3.pop()
print('隨機洗掉元素, s3={}'.format(s3)) # 隨機洗掉元素, s3={'a', 'c'}
s3.clear()
print('清空所有元素, s3={}'.format(s3)) # 清空所有元素, s3=set()
s1.remove('a')
print('洗掉指定元素,s1={}'.format(s1)) # 洗掉指定元素,s1={1, 33, 'o', 'n', 12, 'ab', 'dd', 'cd', 'b', 'c'}
此外,還有專門的集合操作,包括求取兩個集合的并集、交集
# 判斷是否子集, issubset()
a = set('abc')
b = set('bc')
c = set('cd')
print('b是否a的子集:', b.issubset(a)) # b是否a的子集: True
print('c是否a的子集:', c.issubset(a)) # c是否a的子集: False
# 并集操作,union() 或者 |
print('a 和 c 的并集:', a.union(c)) # a 和 c 的并集: {'c', 'b', 'a', 'd'}
print('a 和 c 的并集:', a | c) # a 和 c 的并集: {'c', 'b', 'a', 'd'}
# 交集操作,intersection() 或者 &
print('a 和 c 的交集:', a.intersection(c)) # a 和 c 的交集: {'c'}
print('a 和 c 的交集:', a & c) # a 和 c 的交集: {'c'}
# 差集操作,difference() 或者 - ,即只存在一個集合的元素
print('只在a中的元素:', a.difference(c)) # 只在a中的元素:: {'b', 'a'}
print('只在a中的元素:', a - c) # 只在a中的元素:: {'b', 'a'}
# 對稱差集, symmetric_difference() 或者 ^, 求取只存在其中一個集合的所有元素
print('對稱差集:', a.symmetric_difference(c)) # 對稱差集: {'a', 'd', 'b'}
print('對稱差集:', a ^ c) # 對稱差集: {'a', 'd', 'b'}
資料型別的轉換
有時候我們需要對資料型別進行轉換,比如串列變成字串等,這種轉換一般只需要將資料型別作為函式名即可,下面列舉了這些轉換函式:
int(x, [,base]):將 x 轉換為整數,base 表示進制,默認是十進制
float(x):將 x 轉換為一個浮點數
complex(x, [,imag]):創建一個復數, imag 表示虛部的數值,默認是0
str(x):將物件 x 轉換為字串
repr(x): 將物件 x 轉換為運算式字串
eval(str): 用來計算在字串中的有效 Python 運算式,并回傳一個物件
tuple(s): 將序列 s 轉換為一個元組
list(s): 將序列 s 轉換為一個串列
set(s):轉換為可變集合
dict(d): 創建一個字典,d 必須是一個序列 (key,value)元組
frozenset(s): 轉換為不可變集合
chr(x):將一個整數轉換為一個字符
ord(x):將一個字符轉換為它的整數值
hex(x):將一個整數轉換為一個十六進制字串
oct(x):將一個整數轉換為一個八進制字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/90821.html
標籤:Python
下一篇:說說我對 WSGI 的理解
