更新時(shí)間:2017-12-26 來源:黑馬程序員 瀏覽量:
定義集合
集合就像籃子,你可以放進(jìn)和取出東西,可以是同一類的東西,也可以是不同類的?;旧?,它是個(gè)讓你收集東西的存儲(chǔ)結(jié)構(gòu)。
比如你有一個(gè)車的類型(car),創(chuàng)建了幾種車,想把這些車放在一起又容易找到,就是運(yùn)用集合非常好的場(chǎng)景。
集合存在于內(nèi)存中。你不需要?jiǎng)?chuàng)建集合或者任何架板,這些都是現(xiàn)成的。只要有個(gè)變量就可以往里面放車子了。完了之后你就可以根據(jù)名字或者索引(在集合中的參數(shù))把他們?nèi)〕觥?/p>
ython提供了許多自建類型歸屬于集合類,但是沒有一個(gè)叫collection的類型,他們是lists,mappings,和sets。
list
列表:list是Python內(nèi)置的一個(gè)數(shù)據(jù)類型。list是可變的允許添加同一類型或不同類型的元素,類似于其他語言中的指針。
下面的例子是創(chuàng)建列表并添加元素:
alist = ["item1", "item2", 4]
注意這個(gè)列表成分混雜,包含了字符串和整數(shù)類型。
要取回列表中的元素,只需引用該元素的索引序號(hào)。Python列表序號(hào)是從零開始的,如果我要最后一個(gè)元素,它是第3位,我需要用2來索引:
alist[2]
> 4
系統(tǒng)返回了4。取列表中的元素時(shí),只要從它的位置減去1就得到正確的索引序號(hào)。
檢查列表長(zhǎng)度用len命令:
len(alist)
> 3
向列表添加元素用append()函數(shù):
alist.append(False)
len(alist)
> 4
我們?cè)黾恿艘晃涣斜黹L(zhǎng)度,添加了一個(gè)數(shù)據(jù)類型—布爾類型。列表并沒有表示任何不滿。
我們可以調(diào)用remove()移除列表元素:
alist.remove("item2")
remove()沒有返回參數(shù),列表會(huì)被更新,現(xiàn)在它包含三個(gè)元素:
['item1', 4, False]
有幾種方法將元素從列表中取出。我們前面說過用索引訪問元素,如果我訪問索引2,將會(huì)得到元素3。
thevalue = alist[2]
print(thevalue)
> False
上面的代碼為我們復(fù)制了元素,元素還在列表中,列表的長(zhǎng)度不會(huì)受到影響。
然而我們用pop(), 在得到元素的同時(shí)將元素移除了列表:
thevalue = alist.pop(1) print(thevalue)
> 4
print("after pop", alist)
> ['item1', False]
列表也可以被排序,我們有包含字符串的列表:
alpha = ["z", "b", "a", "c"]
你可以用sort()命令來排序:
alpha.sort()
沒有返回值,但alpha已經(jīng)被排序了,你可以打印出來看看:
print(alpha)
['a', 'b', 'c', 'z']
元素可以被反序排列,只需引用reverse():
alpha.reverse
字符串是列表嗎?
字符串與列表有很多相似之處,但字符串是不可改動(dòng)的,而列表可以隨意修改。
字符串可以向列表一樣索引。你可以像數(shù)列表中元素一樣數(shù)出字符串中的字符。
比如:
mystring = "The quick brown fox."
print(len(mystring ))
> 20
print(mystring[4])
> q
和列表不一樣的是你不能追加字符,也不能更改字符串中特定位置字符。
我們看一下給特定位置分配字符會(huì)出現(xiàn)什么情況:
mystring[4] = 'z'
> TypeError: 'str' object does not support item assignment
根據(jù)字符串,可以將它轉(zhuǎn)化成列表。取上面用到的mystring變量,我們用split(),它會(huì)在空格斷開:
stringlist = mystring.split()
stringlist
> ['The', 'quick', 'brown', 'fox.']
type(stringlist)
>
每個(gè)單詞都變成了列表中的元素,我們也清楚的看到類型變?yōu)榱斜怼?/p>
如果字符串沒有空格我們也可以轉(zhuǎn)換,但結(jié)果如何呢,看看吧:
mystring2 = "Thequickbrownfox."
stringlist2 = mystring2.split()
stringlist2
> ['Thequickbrownfox.']
type(stringlist2)
>
我們還是得到了一個(gè)列表,單只有一個(gè)元素。在這個(gè)例子中,這個(gè)轉(zhuǎn)換沒有多大用處。
mappings
mapping也是內(nèi)置類型,只在字典中使用。字典是鍵/值對(duì)應(yīng)的,不同于列表,我們不用序號(hào)索引,代之的是字典的鍵(key)。
類似列表創(chuàng)建字典用鍵/值成對(duì)而不是單一元素,給個(gè)例子:
mydictionary = {"item1":45, "item2":76, "item3":145}
每個(gè)鍵/值用冒號(hào)分開,前面是鍵后面是值。在第一個(gè)元素中,item1是鍵,45是值。同時(shí)注意我們用大括號(hào)來包住元素。
當(dāng)從字典中取元素時(shí),序號(hào)不可用了,那我們就該想到鍵。如果要item2,我們這樣做:
mydictionary["item2]
> 76
和列表一樣,可以查看字典的長(zhǎng)度:
len(mydictionary)
> 3
改變item2的值,可以直接給他賦值:
mydictionary["item2] = 100
增加元素也是直接賦值:
mydictionary["item62"] = 433
item62現(xiàn)在就存在于字典了,字典長(zhǎng)度加1。
根據(jù)鍵可以刪除字典元素:
del mydictionary["item2"]
前面提到字典是鍵/值成對(duì)出現(xiàn),如果我們只要鍵可以這樣做:
mydictionary.keys()
> dict_keys(['item3', 'item1', 'item62'])
訪問值也是同樣的方法:
mydictionary.values()
> dict_values([145, 45, 433])
Sets
set是無序的集合,不能有重復(fù)的元素,也不能排序,sort()是不能使用的。
同列表相比set驗(yàn)證元素是否存在會(huì)更快。
創(chuàng)建一個(gè)set:
myset = {3, 4, 5, 1}
或者用set語句來轉(zhuǎn)化已存在的類型:
multistory = [0,1,5,4,3,7,6,6]
myself = set(multistory)
> {0,1,3,4,5,6,7}
因?yàn)閟et只能包含唯一的元素,所以重復(fù)的6被移除了。從已有數(shù)據(jù)創(chuàng)建唯一元素集合,set()是個(gè)非常好的方法。
如果我試圖讓移除的6回來,它是不會(huì)理會(huì)的:
myself.add(6)
> {0, 1, 3, 4, 5, 6, 7}
要移除set中元素需要用remove():
myself.remove(4)
set也不支持索引,用序號(hào)來訪問,它會(huì)返回錯(cuò)誤:
myset[2] >TypeError: 'set' object does not support indexing
set有些獨(dú)有的方法,如果你熟悉set的數(shù)學(xué)方法(difference,intersection和union),會(huì)很好用。
我們從difference開始,假設(shè)我有兩個(gè)set:
set1 = {1,3,6,7}
set2 = {1,3,6,8,10}
用set1和set2做difference會(huì)得到7,7在set1而不在set2。
set1.difference(set2)
> {7}
反過來用set2和set1做對(duì)比:
set2.difference(set1)
> {8, 10}
也可以來找它們的相同部分:
set.intersection(set2)
> {1, 3, 6}
最后來看把它們合并起來形成一個(gè)新的set:
set3 = {set1.union(set2)
> {1, 3, 6, 7, 8, 10}
新的set包含它們兩個(gè)中所有元素。
總結(jié)
我們看過了list,string(雖然不屬于集合),dictionary和set。學(xué)習(xí)了它們所有的特定運(yùn)算和獨(dú)有功能。希望這個(gè)介紹可以讓你對(duì)Python的集合多點(diǎn)認(rèn)識(shí)。
本文版權(quán)歸黑馬程序員人工智能+Python學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:黑馬程序員人工智能+Python培訓(xùn)學(xué)院
首發(fā):http://python.itheima.com/