摘要:下面讓我們一塊來(lái)看下的中高級(jí)數(shù)據(jù)結(jié)構(gòu)。到現(xiàn)在,我們學(xué)習(xí)了列表元組字典和集合種高級(jí)數(shù)據(jù)結(jié)構(gòu)。
< 返回索引頁(yè)
高級(jí)數(shù)據(jù)結(jié)構(gòu)
列表與元組
什么是列表
列表的操作
什么是元組
元組的操作
字典與集合
字典的定義
字典的操作
集合的定義
集合的操作
序列
序列的通用操作
可變類型和不可變類型
深copy和淺copy
總結(jié)
練習(xí)
參考
高級(jí)數(shù)據(jù)結(jié)構(gòu)我們知道Python的變量數(shù)據(jù)類型有整型、浮點(diǎn)型、復(fù)數(shù)、字符串和布爾型,我們會(huì)發(fā)現(xiàn)這些類型結(jié)構(gòu)都比較的簡(jiǎn)單。在我們學(xué)習(xí)數(shù)學(xué)時(shí),有整數(shù)、浮點(diǎn)數(shù)等這些基本的數(shù)據(jù)類型,還有數(shù)組等這種高級(jí)的數(shù)據(jù)類型供我們來(lái)處理一些復(fù)雜的數(shù)據(jù)問(wèn)題使用。那么Python語(yǔ)言作為一門高級(jí)的編程語(yǔ)言,對(duì)這些高級(jí)的數(shù)據(jù)結(jié)構(gòu)也是支持的。
下面讓我們一塊來(lái)看下Python的中高級(jí)數(shù)據(jù)結(jié)構(gòu)。
列表與元組 什么是列表列表,Python 類為list,一種Python的高級(jí)數(shù)據(jù)結(jié)構(gòu),使用中括號(hào)包含,其中內(nèi)部元素使用逗號(hào)分隔,內(nèi)部元素可以是任何類型包含空。有點(diǎn)像我們數(shù)學(xué)中學(xué)習(xí)的數(shù)組。
a = [1,2,3] b = ["1",2,None] c = [1,2,[3,4]] d = [] e = [1]
列表的操作知識(shí)點(diǎn):
列表中的元素是有序的。
列表的下標(biāo)操作
獲取列表中的值
列表和字符串一樣是可以通過(guò)下標(biāo)來(lái)獲取指定位置的元素的。列表的下標(biāo)是從1開(kāi)始的,最大下標(biāo)值為元素個(gè)數(shù)減1或-1表示。
>>> a = [1,2,3] >>> print(a[1]) 2
列表更新
可通過(guò)列表的下標(biāo)來(lái)替換更新列表中指定元素。
>>> a = [1,2,3] >>> a[2] = "2" >>> a [1, 2, "2"] >>>
列表的刪除
>>> a [1, 2, "2"] >>> del a[2] >>> a [1, 2]
切片
可通過(guò)下標(biāo)來(lái)做列表的截取等操作,在Python中也叫切片。格式如:list[start_index:end_index:step_length]
start_index開(kāi)始下標(biāo)省略時(shí),默認(rèn)為 0 ;end_index結(jié)束下標(biāo)省略時(shí),默認(rèn)為最大下標(biāo),及長(zhǎng)度-1或-1;step_length步長(zhǎng)省略時(shí),默認(rèn)為1。
>>> a [1, 2, 3, 4] >>> a[1:-1] [2, 3] >>> t = [1,2,3,4,5] >>> t[::2] [1, 3, 5]
運(yùn)算符及內(nèi)建函數(shù)操作
可用使用內(nèi)建函數(shù)len 來(lái)獲取列表的長(zhǎng)度,該長(zhǎng)度及列表元素的個(gè)數(shù)。
>>> a [1, 2] >>> len(a) 2 >>> a[::2] [1, 3]
列表可使用運(yùn)算符 +實(shí)現(xiàn)連接操作。
>>> [1,2,3]+[5,6,7] [1, 2, 3, 5, 6, 7]
可以使用內(nèi)建函數(shù)reversed 將列表反轉(zhuǎn),該函數(shù)返回一個(gè)迭代器(可理解為一個(gè)可遍歷對(duì)象即可,后邊會(huì)講解)。
>>> a = [1,2,3,4] >>> reversed(a)>>> list(reversed(a)) [4, 3, 2, 1]
除了使用reversed 函數(shù),也可使用列表的切片來(lái)反轉(zhuǎn):
>>> a [1, 2, 3, 4] >>> a[::-1] [4, 3, 2, 1]
python 可使用 * 來(lái)實(shí)現(xiàn)重復(fù)。
>>> [1]*2 [1, 1]
列表也支持in、not in成員運(yùn)算符
>>> 3 in [1,2,3] True >>> 3 not in [1,2,3] False
列表的方法
>>> dir(list) ["__add__", "__class__", "__contains__", "__delattr__", "__delitem__", "__dir__", "__doc__", "__eq__", "__format__", "__ge__", "__getattribute__", "__getitem__", "__gt__", "__hash__", "__iadd__", "__imul__", "__init__", "__init_subclass__", "__iter__", "__le__", "__len__", "__lt__", "__mul__", "__ne__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__reversed__", "__rmul__", "__setattr__", "__setitem__", "__sizeof__", "__str__", "__subclasshook__", "append", "clear", "copy", "count", "extend", "index", "insert", "pop", "remove", "reverse", "sort"]
list.append(obj) 在列表末尾添加新的對(duì)象
list.count(obj) 統(tǒng)計(jì)某個(gè)元素在列表中出現(xiàn)的次數(shù)
list.extend(seq) 在列表末尾一次性追加另一個(gè)序列中的多個(gè)值(用新列表擴(kuò)展原來(lái)的列表)
list.index(obj) 從列表中找出某個(gè)值第一個(gè)匹配項(xiàng)的索引位置
list.insert(index, obj) 將對(duì)象插入列表
list.pop([index=-1]]) 移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素),并且返回該元素的值
list.remove(obj) 移除列表中某個(gè)值的第一個(gè)匹配項(xiàng)
list.reverse() 反向列表中元素
list.sort(cmp=None, key=None, reverse=False) 對(duì)原列表進(jìn)行排序
list.clear() 清空列表
list.copy() 復(fù)制列表
什么是元組元組,Python中類為 tuple。使用小括號(hào)包括,內(nèi)部元素使用逗號(hào)分隔,可為任意值。與列表不同之處為,其內(nèi)部元素不可修改,及不能做刪除、更新操作。
>>> a = (1,2,3) >>> b = ("1",[2,3]) >>> c = ("1","2",(3,4)) >>> d = () >>> e = (1,)
元組的操作說(shuō)明:
當(dāng)元組中元素只有一個(gè)時(shí),結(jié)尾要加逗號(hào)。若不加逗號(hào),python解釋器將解釋成元素本身的類型,而非元組類型。
通過(guò)下標(biāo)操作
通過(guò)小標(biāo)來(lái)獲取元素值,使用方法同列表。
切片的處理,使用方法同列表。
不可通過(guò)下標(biāo)做刪除和更新操作。
>>> c[0] = 1 Traceback (most recent call last): File "", line 1, in TypeError: "tuple" object does not support item assignment >>> del c[0] Traceback (most recent call last): File " ", line 1, in TypeError: "tuple" object doesn"t support item deletion
運(yùn)算符及內(nèi)建函數(shù)操作
元組本身是不可變,但是可通過(guò)+來(lái)構(gòu)成新的元組。
>>> a (1, 2, 3) >>> b ("1", [2, 3]) >>> a + b (1, 2, 3, "1", [2, 3])
可使用內(nèi)建函數(shù) len 獲取元組長(zhǎng)度。
可使用* 元素符實(shí)現(xiàn)元素的重復(fù)。
>>> a (1, 2, 3) >>> a*2 (1, 2, 3, 1, 2, 3)
元組也支持in和not in 成員運(yùn)算符。
字典與集合 字典的定義在編程世界中,有一種高級(jí)結(jié)構(gòu)是使用比較廣泛的,即key和value值一一對(duì)應(yīng)的映射結(jié)構(gòu)。它就像一個(gè)字典一樣,通過(guò)關(guān)鍵字key,來(lái)找到對(duì)應(yīng)的value值。該種結(jié)構(gòu)在Python中叫做字典,英文為dict,使用大括號(hào)包括,其中元素為冒號(hào)分隔key-value對(duì),中間用逗號(hào)分隔。
結(jié)構(gòu)如下:
>>> a = {"name":"Tim", "age":18} >>> b = {} >>> c = dict(name="Tim", age=18) >>> d = {(1,2):"Time"}
字典的操作知識(shí)點(diǎn):
字典中,key 值唯一,且類型為不可變類型,如字符串、元組、數(shù)字。
value 值可以為任意類型;
字典中的元素是無(wú)序的。
獲取字典某元素
可使用key和方法get來(lái)獲取字典中的值。
>>> a = {"name":"Tim", "age":18} >>> a["name"] "Tim" >>> a.get("name","") "Tim" >>> a["address"] Traceback (most recent call last): File "", line 1, in KeyError: "address"
知識(shí)點(diǎn):
當(dāng)字典沒(méi)有沒(méi)有該key時(shí),使用key獲取,會(huì)拋出KeyError錯(cuò)誤;使用get不會(huì)拋出,會(huì)返回None。
可使用get(key,[default])函數(shù)給
更新和刪除字典
字典是可變的,可通過(guò)key來(lái)做更新和刪除操作。
# 修改 >>> a {"name": "Tim", "age": 18} >>> a["address"] = "Beijing" >>> a {"name": "Tim", "age": 18, "address": "Beijing"} # 刪除 >>> del a["age"] >>> a {"name": "Tim", "address": "Beijing"}
字典的方法操作
字典的方法提供了更加豐富的操作功能:
radiansdict.clear() 刪除字典內(nèi)所有元素
radiansdict.copy() 返回一個(gè)字典的淺復(fù)制,返回原字典的引用
radiansdict.fromkeys() 創(chuàng)建一個(gè)新字典,以序列seq中元素做字典的鍵,val為字典所有鍵對(duì)應(yīng)的初始值
radiansdict.get(key, default=None) 返回指定鍵的值,如果值不在字典中返回default值
key in dict 如果鍵在字典dict里返回true,否則返回false
radiansdict.items() 以列表返回可遍歷的(鍵, 值) 元組數(shù)組
radiansdict.keys() 以列表返回一個(gè)字典所有的鍵
radiansdict.setdefault(key, default=None) 和get()類似, 但如果鍵不存在于字典中,將會(huì)添加鍵并將值設(shè)為default
radiansdict.update(dict2) 把字典dict2的鍵/值對(duì)更新到dict里
radiansdict.values() 以列表返回字典中的所有值
pop(key[,default]) 刪除字典給定鍵 key 所對(duì)應(yīng)的值,返回值為被刪除的值。key值必須給出。 否則,返回default值。
popitem() 隨機(jī)返回并刪除字典中的一對(duì)鍵和值(一般刪除末尾對(duì))。
集合的定義集合(set)和字典(dict)類似,它是一組 key 的集合,但不存儲(chǔ) value。集合的特性就是:key 不能重復(fù)。
>>> s = {"1","2","3"} # 不推薦,當(dāng)元素中有字典時(shí),會(huì)報(bào)錯(cuò) >>> s {"2", "1", "3"} >>> s2 = set(["1","2","3"]) >>> s2 {"2", "1", "3"} >>> type(s)集合的操作>>> type(s2)
交集、并集和合集
Python中的集合與數(shù)學(xué)中的集合一樣,也有交集、并集和合集。
>>> s1 = {1,2,3,4,5} >>> s2 = {1,2,3} >>> s3 = {4,5} >>> s1&s2 # 交集 {1, 2, 3} >>> s1|s2 # 并集 {1, 2, 3, 4, 5} >>> s1 - s2 # 差差集 {4, 5} >>> s3.issubset(s1) # s3 是否為s1 的子集 True >>> s1.issuperset(s2) # s1 是否為 s2 的超集 True
集合的方法操作
集合中常用方法如下:
set.add(obj) 添加集合元素
set.remove(obj) 刪除集合元素
set.update(set) 合并集合
set.pop() 隨機(jī)刪除一個(gè)元素,并返回該元素
序列序列(sequence),在Python中是一種具有相同特性的高級(jí)數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,可以使用下標(biāo)來(lái)獲取元素和切分。到現(xiàn)在,我們學(xué)習(xí)了列表、元組、字典和集合4種高級(jí)數(shù)據(jù)結(jié)構(gòu)??梢园l(fā)現(xiàn),列表和元組在操作上有許多相同的地方。除了列表和元組,還有字符串也是序列??梢?jiàn)列表、元組、字符串為序列,字典、集合、數(shù)值為非序列。
序列的通用操作通過(guò)索引來(lái)獲取元素值
分片操作
通過(guò)+合并元素
通過(guò)*來(lái)復(fù)制元素
支持成員運(yùn)算符
最大值、最小值和長(zhǎng)度函數(shù)支持
>>> l = [1,2,3] >>> t = (1,2,3) >>> s = "123" >>> print(l[0],t[1],s[2]) 1 2 3 >>> print(l[:1],t[:2],s[:-1]) [1] (1, 2) 12 >>> print(l+[4], t+(4,), s+"4" ) [1, 2, 3, 4] (1, 2, 3, 4) 1234 >>> print(l*2, t*2, s*2) [1, 2, 3, 1, 2, 3] (1, 2, 3, 1, 2, 3) 123123 >>> print(2 in l, 2 in t, "2" in s) True True True >>> print(max(l), min(t), len(s)) 3 1 3可變類型和不可變類型
除了序列,Python中還可以根據(jù)數(shù)據(jù)結(jié)構(gòu)內(nèi)存中的數(shù)值是否可以被改變,分為可變類型和不可變類型。
這里的可變不可變,是指內(nèi)存中的值是否可以被改變。如果是不可變類型,在對(duì)對(duì)象本身操作的時(shí)候,必須在內(nèi)存中新申請(qǐng)一塊區(qū)域(因?yàn)槔蠀^(qū)域#不可變#)。如果是可變類型,對(duì)對(duì)象操作的時(shí)候,不需要再在其他地方申請(qǐng)內(nèi)存,只需要在此對(duì)象后面連續(xù)申請(qǐng)(+/-)即可,也就是它的地址會(huì)保持不變,但區(qū)域會(huì)變長(zhǎng)或者變短。
可變類型(mutable):列表,字典,集合;
不可變類型(unmutable):數(shù)字,字符串,元組;
深copy和淺copy在學(xué)習(xí)字典時(shí),字典有個(gè)copy,可以得到字典的副本。其他類型如何處理呢,Python提供了一個(gè)內(nèi)置的copy庫(kù)用來(lái)支持其他類型的復(fù)制。copy庫(kù)主要有2個(gè)方法,copy 和 deepcopy分別表示淺拷貝和深拷貝。淺拷貝是新創(chuàng)建了一個(gè)跟原對(duì)象一樣的類型,但是其內(nèi)容是對(duì)原對(duì)象元素的引用。這個(gè)拷貝的對(duì)象本身是新的,但內(nèi)容不是??截愋蛄蓄愋蛯?duì)象(列表元組)時(shí),默認(rèn)是淺拷貝。
下面咱們來(lái)分析下淺拷貝和深拷貝的區(qū)別。
普通情況下,賦值只是創(chuàng)建一個(gè)變量,該變量指向值內(nèi)存地址,如下例:
n4 = n3 = n2 = n1 = "123/"Wu""
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 = n1
淺拷貝,在內(nèi)存中只額外創(chuàng)建第一層數(shù)據(jù),如下圖:
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n3 = copy.copy(n1)
深拷貝,在內(nèi)存中將所有的數(shù)據(jù)重新創(chuàng)建一份(排除最后一層,即:python內(nèi)部對(duì)字符串和數(shù)字的優(yōu)化),如下圖:
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n4 = copy.deepcopy(n1)
圖片來(lái)源:博客地址
總結(jié)到此,我們把Python的基本語(yǔ)法和數(shù)據(jù)結(jié)構(gòu)過(guò)了一遍。那我們來(lái)總結(jié)下,我們都學(xué)到了什么:
1、高級(jí)數(shù)據(jù)結(jié)構(gòu)及其操作:列表、元組、字典、集合、序列;
這些只是基本語(yǔ)法的組成元素。在程序運(yùn)行時(shí),可能會(huì)有多種情況,需要對(duì)這些結(jié)構(gòu)做判斷或者需要按順序讀取列表的全部元素,那么這個(gè)時(shí)候便需要邏輯處理結(jié)構(gòu)。下一章,我們來(lái)講解Python中的邏輯處理的控制流語(yǔ)法。
練習(xí)1、現(xiàn)在有一個(gè)包含N個(gè)元素的元組或者是序列,怎樣將它里面的值解壓后同時(shí)賦值給N個(gè)變量?
>>> data = [ "ACME", 50, 91.1, (2012, 12, 21) ] >>> name, shares, price, date = data >>> data = [ "ACME", 50, 91.1, (2012, 12, 21) ] >>> _, shares, price, _ = data
2、怎樣從一個(gè)集合中獲得最大或者最小的N個(gè)元素列表?
max([1,2,2,3]) min([1,2,3,4])
3、大家知道字典是無(wú)序的,如何給字典排序?
from collections import OrderedDict d = OrderedDict() d["foo"] = 1 d["bar"] = 2 d["spam"] = 3 d["grok"] = 4 print(d)參考
https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day02/%E8%AF%AD%E8%A8%80%E5%85%83%E7%B4%A0.md
http://www.cnblogs.com/wupeiqi/articles/5433925.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41953.html
摘要:針對(duì)的初學(xué)者,從無(wú)到有的語(yǔ)言如何入門,主要包括了的簡(jiǎn)介,如何下載,如何安裝,如何使用終端,等各種開(kāi)發(fā)環(huán)境進(jìn)行開(kāi)發(fā),中的語(yǔ)法和基本知識(shí)概念和邏輯,以及繼續(xù)深入學(xué)習(xí)的方法。 ...
摘要:但是相對(duì)于開(kāi)發(fā)者來(lái)說(shuō)語(yǔ)言提供了更加強(qiáng)大的支持。自身的強(qiáng)類型的機(jī)制異常處理垃圾自動(dòng)收集等是其程序健壯性的重要保證??蚣艿脑O(shè)計(jì)理念也遵循了優(yōu)雅明確簡(jiǎn)單,并具有簡(jiǎn)潔易讀及可拓展性。 關(guān)于Python的發(fā)展,及Python的歷史概述我這里將不會(huì)浪費(fèi)時(shí)間和大家介紹,因?yàn)槲矣X(jué)得能夠借用搜索引擎搜索到的知識(shí)大家就竟可能的自己動(dòng)手動(dòng)腦去了解和認(rèn)知,我主要就講講Python的一些基本的特性及版本的選擇相...
摘要:數(shù)據(jù)分析的發(fā)展方向一般有商業(yè)方向,行業(yè)分析業(yè)務(wù)方向,和機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘方向。機(jī)器學(xué)習(xí)的書籍推薦統(tǒng)計(jì)學(xué)習(xí)方法,機(jī)器學(xué)習(xí),機(jī)器學(xué)習(xí)實(shí)戰(zhàn)三本書。 作者:xiaoyu 微信公眾號(hào):Python數(shù)據(jù)科學(xué) 知乎:python數(shù)據(jù)分析師 上一篇主要分享了博主親身轉(zhuǎn)行數(shù)據(jù)分析的經(jīng)歷: 【從零學(xué)起到成功轉(zhuǎn)行數(shù)據(jù)分析,我是怎么做的?】 本篇繼上一篇將分享轉(zhuǎn)行數(shù)據(jù)分析的一些經(jīng)驗(yàn)和學(xué)習(xí)方法,看完這篇你將會(huì)解...
摘要:盡管如此,還具有高級(jí)的數(shù)據(jù)類型和靈活性。它配備了大量的標(biāo)準(zhǔn)模塊,可用于程序庫(kù)。一些模塊提供如下功能通過(guò)這些很贊的特性,瞬時(shí)化身為面向過(guò)程的語(yǔ)言。開(kāi)發(fā)者可以便捷地將解釋器連接到一個(gè)使用編寫的應(yīng)用程序,并能隨時(shí)用作擴(kuò)展。下一部分會(huì)繼續(xù)分享。 【編者按】本文作者是 Abhishek Jaiswal ,擅長(zhǎng) .NET、C#、Python 等多種語(yǔ)言的技術(shù)控。本文中,作者通過(guò)活潑有趣的口吻向大家...
閱讀 1926·2021-11-24 09:39
閱讀 3515·2021-09-28 09:36
閱讀 3282·2021-09-06 15:10
閱讀 3433·2019-08-30 15:44
閱讀 1154·2019-08-30 15:43
閱讀 1797·2019-08-30 14:20
閱讀 2712·2019-08-30 12:51
閱讀 2031·2019-08-30 11:04