Python聯合數據類型

集合

集合操作符

操作符及應用 描述
S|T(並) 返回一個新的集合,包括S和T中的所有元素
S-T(差) 返回一個新的集合,包括在S中卻不在T中的元素
S&T(交) 返回一個新的集合,包括同時在S和T中的元素
S^T(補) 返回一個新的集合,包括S和T中非相同元素
A={'p','y',123}
B=set('py123')
print(A-B)>>>{123}
print(B-A)>>>{'3', '2', '1'}
'注意差集運算的區別'
print(A&B)>>>{'y', 'p'}
print(A|B)>>>{'y', '1', '2', '3', 123, 'p'}

差集運算符會把放在前面的作爲主體比如A-B的意思是返回一個集合,這個集合包括在A中卻不在B中的元素
B-A就恰恰相反返回一個集合,這個集合包括在B中卻不在A中的元素

增強操作符

Python又提供了對應的4種增強操作符

操作符及應用 描述
S|=T 更新S集合,包括S和T中的所有元素
S-=T 更新S集合,包括在S中卻不在T中的元素
S&=T 更新S集合,包括同時在S和T中的元素
S^=T 更新S集合,包括S和T中非相同元素

如果不使用增強操作符的話,返回的是一個新的集合A,如果使用了的話,相當於把原來的集合S更新爲集合A

集合的方法或方法

方法或函數 描述
S.add(x) 如果x不在S中,將x添加的S中
S.discard(x) 將x從S中移除,如果x不存在S中,不報錯
S.remove(x) 將x從S中移除,如果x不存在S中,產生KeyError異常
S.clear() 移除S中的所有元素
S.pop() 隨機移除一個元素x並把x返回,如果S爲空則產生KeyError異常
S.copy() 返回一個S的副本
len(S) 返回S的元素個數
x in S 判斷x是否在S中,在就返回True,不在就返回False
x not in S 與上面返回結果相反
set(x) 將其他類型x轉變爲集合類型x

值得注意是

printf(set(3))
>>>TypeError: 'int' object is not iterable
'"int"類型的對象是不可迭代的'

這裏我們就不得不說一下迭代器可迭代對象的事情了

可迭代對象

可迭代對象 常見的可迭代對象
能直接作用於for循環的對象我們統稱爲可迭代對象 list、set,dict,tuple,str,range,生成器

生成器

定義:一邊循環一邊計算的這種機制我們稱之爲生成器[可以不斷推算出下一個元素
注意:生成器只能迭代一遍
創建生成器
g = (result for x in range(m,n))

g1 = (x for x in range(10))
for x in g1:
    print(x,end="\t")  '輸出0 1 2 3 4 5 6 7 8 9'

迭代器

不但能夠作用於for循環,還可以被next函數調用,不斷返回下一個值,這樣的對象我們就稱之爲迭代器

常見的只有生成器是迭代器,其他類型的都不是。
可以通過iter()函數將可迭代對象轉爲迭代器。

iter1 = iter([1,2,3])
print(iter1)      '返回<list_iterator object at 0x00000000021AA278>'
print(type(iter1))  "返回<class 'list_iterator'>"
print(next(iter1))   '輸出1'

iterator一定iterable,但是iterable不一定是iterator
只有生成器是iterator

import collections

g = (x for x in range(10))
print(isinstance([],collections.abc.Iterable))     '返回True'
print(isinstance("",collections.abc.Iterable))     '返回True'
print(isinstance({},collections.abc.Iterable))     '返回True'
print(isinstance((),collections.abc.Iterable))     '返回True'
print(isinstance(range(10),collections.abc.Iterable))   '返回True'
print(isinstance(g,collections.abc.Iterable))      '返回True'

print(isinstance([],collections.abc.Iterator))   '返回False'
print(isinstance("",collections.abc.Iterator))     '返回False'
print(isinstance({},collections.abc.Iterator))      '返回False'
print(isinstance((),collections.abc.Iterator))     '返回False'
print(isinstance(range(10),collections.abc.Iterator))     '返回False'
print(isinstance(g,collections.abc.Iterator))      '返回True'

可以看出在判斷是否是iterator的時候只有生成器g返回了True。

集合的應用場景

1.數據去重

ls=['p','p','y','y','123']
s=set(ls) '轉換爲集合'
print(s)
ls=list(s)  '再轉換爲列表'
print(ls)  '現在的列表沒有重複的元素'
{'y', '123', 'p'}
['y', '123', 'p']
>>> 

序列

序列是具有先後關係的一組元素。他是一維元素向量,元素類型可以不同。元素間由特定的序號引導,通過下標訪問特定的元素
序列是一種基類型,我們通常使用的是序列衍生出來的類型

序列
字符串類型
元組類型
序列類型

序列操作

序列的操作對它的衍生類型都是適用的

操作符及應用 描述
x in S 判斷x是否在S中,在就返回True,不在就返回False
x not in S 與上面返回結果相反
x+t 將x和t連接
n*s或s*n 將s複製n次
s[i] 返回s的第i個元素
s[i:j:k] 切片,返回s中從序號ij-1k爲步長的子序列

值得注意的是連接操作中的序列必須是同一類型纔行

ls=['p','p','y','y','123']
s=tuple(ls) 
print(s)
ls=list(s)  
print(ls)  
print(ls+s) 
('p', 'p', 'y', 'y', '123')
['p', 'p', 'y', 'y', '123']
TypeError: can only concatenate"v.連接" list (not "tuple") to list
'僅能list之間進行連接,而不是元組類型和列表類型'
函數和方法 描述
len(s) 返回s的長度
min(s) 返回s中最小的元素,前提是s中的元素能夠比較
max(s) 返回s中最大的元素,前提是s中的元素能夠比較
s.index(x)或s.index(x,j,k) 返回元素x在序號jk-1之間第一次出現的序號
s.count(x) 返回x在s中出現的總次數

又值得注意的是s.index(x,j,k)這個函數

ls=['p','p','y','y','123']
print(ls.index('y'))   
print(ls.index('y',0,2))  
2
ValueError: 'y' is not in list
'也就是說只會尋找序號0到2-1=1的元素,所以出現了ValueError異常'

元組類型

元組一旦被創建就不能修改,正因爲此元組沒有什麼特殊的操作。
稍微值得一講的就是

'元組在創建時可以不用小括號'
import operator
A='p','y','1','2','3'
B=('p','y','1','2','3')
print(operator.eq(A,B))
print(A is B)
True
True
>>>

可以看出元組A和元組B是一樣的,不僅內容相同,就連引用對象也是相同的
還有一個就是怎麼取元組中的聯合類型的元素

B=('p',('y','123'))
print(B[0])
print(B[1][0])
print(B[1][1])
'B[1]取出元組('y','123'),然後再用一箇中括號來取'
'學過C,C艹,java的同學一定覺得很眼熟,這跟二維數組是一個道理'
p
y
123
>>>

列表

函數或方法

函數和方法 描述
ls[x]=i 將ls中的第x元素替換爲i
ls[i:j:k]=lt 用lt替換ls切片後對應元素的子列表
del ls[i] 刪除ls的第i元素
del ls[i:j:k] 刪除ls裏從ij-1步長爲k的元素
ls+=lt 更新ls列表,並把lt添加到ls中
ls.append(x) 將x添加到ls中
ls.clear() 將ls全部清除
ls.copy() 生成一個新列表,複製了ls的所有元素
ls.insert(i,x) 將x插入到ls的序號i位置上
ls.pop(i) 返回第i號元素並刪除
ls.remove(x) 講第一個出現的x刪除
ls.reverse 把ls倒置

序列類型應用場景

元組用於元素不改變的場合

比如保護數據,我們可以把某些數據轉換爲元組類型再進行操作。這正是利用了元組一旦被創立就不能被修改的特點

列表靈活,是最常用的序列類型

最主要的作用:表現一組有序數據並操作他們

字典類型

字典是映射的一種表現

實際上生活中,映射是一種非常常見的數據類型。
下面來介紹一下字典的一些基本概念和操作
##鍵值對
鍵Key用來對應值,key同樣可以翻譯爲鑰匙,這樣可能更好理解keyvalue的關係。
字典是鍵值對的集合,在字典內部鍵值對是無序的。

字典與集合

字典集合都是用大括號來的,但是

d={}'這樣創建的是一個空字典'
'如果想創建一個空集合該怎麼辦的?我們需要用到set()函數'
d=set()

因爲字典是非常常用的數據類型所以創建的方法留給了字典。

字典的方法和函數

函數和方法 描述
del d[k] 刪除d中k對應的數據值
k in d 判斷鍵值k是否在d中
d.keys() 返回d中所有key的信息
d.values() 返回d中所有value的信息
d.items() 返回d中所有鍵值對的信息
d.get(k,<default>) 鍵k存在則返回對應的數據值,不存在則返回<default>值
d.pop(k,<default>) 鍵k存在則取出對應的數據值,不存在則返回<default>值
d.popitem() 隨機取出一對鍵值對,以元組形式返回
d.clear() 刪除d中所有鍵值對
len(d) 返回d中元素的個數

jieba庫的使用

jieb是非常棒的分詞第三方庫,因此我們需要下載。而且要使用命令行操作。

jieba庫的安裝

首先我們打開命令行然後輸入pip install jieba命令下載jieba庫。但是可能出現我們需要更新pip的情況,會提示warning。我們只需要在warning中找到python -m pip install --upgrade pip然後複製粘貼對pip進行更新即可。

jieba庫的三種模式

模式 描述
精確模式 把文本精確的切開,不存在冗餘單詞
全模式 把文本中所有可能的單詞都掃描出來,存在冗餘單詞
搜索引擎模式 在精確模式的基礎上對長單詞再切分,有冗餘

精確模式是常常使用的模式

jieba庫的方法和函數

函數和方法 描述
jieba.lcuts(s) 精確模式,返回一個列表形式的分詞結果
jieba.lcuts(s,cut_all=True) 全模式,返回一個列表形式的分詞結果,存在冗餘
jieba.lcuts() 精確模式,返回一個列表形式的分詞結果
jieba.lcut_for_search(s) 搜索引擎模式,返回一個列表形式的分詞結果,有冗餘
jieba.add_word(w) 向分詞詞典中添加w
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章