集合
集合操作符
操作符及應用 | 描述 |
---|---|
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中從序號i到j-1以k爲步長的子序列 |
值得注意的是連接操作中的序列必須是同一類型纔行
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在序號j到k-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裏從i到j-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同樣可以翻譯爲鑰匙,這樣可能更好理解key和value的關係。
字典是鍵值對的集合,在字典內部鍵值對是無序的。
字典與集合
字典與集合都是用大括號來的,但是
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 |