1. 程式人生 > >【Python五篇慢慢彈】資料結構看python

【Python五篇慢慢彈】資料結構看python

作者:白寧超

2016年10月9日14:04:47

摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一種語言基礎。本系列文章屬於入門內容,老鳥可以略看也可以略過,新鳥可以從篇一<快速上手學python>先接觸下python怎樣安裝與執行,以及pycharm編輯器的使用和配置;篇二<資料結構看python>介紹python語言中控制語句、列表、字典、元組、迴圈等基本操作;篇三<函式修行知python>細解python語言函式的範疇與內容;篇四<模組異常談python>採用登入的案例詳解模組來龍去脈;篇五<‘類’過依然繼續前行,直至ending再出發>介紹類的基本操作,擴充套件虛擬環境、標準類庫和下個系列預告。(本文原創,轉載註明出處:

資料結構看python)

目錄:

1 深入條件控制

 小記:程式設計風格

  • 使用 4 空格縮排,而非 TAB:在小縮排(可以巢狀更深)和大縮排(更易讀)之間,4空格是一個很好的折中。TAB 引發了一些混亂,
  • 使用空行分隔函式和類,以及函式中的大塊程式碼,可能的話,註釋獨佔一行
  • 把空格放到操作符兩邊,以及逗號後面,但是括號裡側不加空格:a = f(1, 2) + g(3, 4)
  • 統一函式和類命名:推薦類名用 駝峰命名, 函式和方法名用 小寫_和_下劃線。
  • Python 的預設情況下,UTF-8最好

while 和 if 語句中使用:比較和包含。
比較操作符 in 和 not in 稽核值是否在一個區間之內。
比較操作可以傳遞。例如 a < b == c 稽核是否 a 小於 b 並且 b 等於 c。
邏輯操作符 and 和 or 組合,not 具有最高的優先順序, or 優先順序最低,所以 A and not B or C 等於 (A and (notB)) or C。
邏輯操作符 and 和 or 引數從左向右解析,結果確定就停止。例如,如果 A 和 C 為真而 B 為假, A and B and C 不會解析 C。
可以把比較或其它邏輯表示式的返回值賦給一個變數,例如:

>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'

解釋:and 和 or 引數從左向右解析,結果確定就停止。string1 or string2 為True,列印string2是值,後面忽略即string3。

 比較序列和其它型別:序列物件可以與相同型別的其它物件比較。

首先比較前兩個元素,如果不同,就決定了比較的結果;如果相同,就比較後兩個元素,依此類推,直到所有序列都完成比較。

>>> (1,3,67)<(1,4,2)
True
>>> (1,3,67)>(1,4,2)
False
>>> [1, 2, 3] < [1, 2, 4]
True

如果兩個元素本身就是同樣型別的序列,就遞迴字典序比較。如果兩個序列的所有子項都相等,就認為序列相等。

>>> (1, 2, 3) == (1.0, 2.0, 3.0)
True

如果一個序列是另一個序列的初始子序列,較短的一個序列就小於另一個。字串的字典序按照單字元的 ASCII 順序。

>>> (1, 2) < (1, 2, -1)
True
>>> (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
True

2 基本的列表物件方法

 List列表基本操作概要:

list.append(x):元素新增到連結串列的結尾,相當於 a[len(a):] = [x]。
list.extend(L):給定列表所有元素新增,相當於 a[len(a):] = L。
list.insert(i, x):指定位置插入。其中list.insert(0, x)=插入連結串列首,list.insert(len(a), x)=list.append(x)=插入連結串列尾
list.remove(x):刪除連結串列指定元素。
list.pop([i]):指定索引下刪除元素,a.pop() 返回最後一個元素。
list.clear():刪除所有元素。相當於 del a[:]。
list.index(x):返回連結串列首個值 x 的索引。
list.count(x):統計元素 x出現的次數。
list.sort():排序。
list.reverse():倒排連結串列。
list.copy():淺拷貝。等同於 a[:]。
操作執行程式碼:

a = [66.25, 333, 333, 1, 1234.5]
print(a.count(333), a.count(66.25), a.count('x'))
a.insert(2, -1)
a.append(333)
[66.25, 333, -1, 333, 1, 1234.5, 333]
a.index(333)
a.remove(333)
a.reverse()
[333, 1234.5, 1, 333, -1, 66.25]
a.sort()
a.pop()

 List連結串列的多重共用

連結串列當作堆疊用:連結串列特性先進後出跟堆疊性質一致,進:append,出:pop:

程式例項演示:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack
[3, 4,5]

連結串列當作佇列使用:如上演示,知道連結串列具備先進後出的性質,即符合堆疊性質。大家記得否連結串列索引可以為負數,如此你是不是想到先進先出啦?對嘍,這就是佇列的性質我們完全可以當著佇列用。列表這樣用效率不高。在頭部插入和彈出很慢,因為一個元素出隊,要移動整個列表中的所有元素。要實現佇列,使用 集合collections.deque,它為在首尾兩端快速插入和刪除而設計。例如:

程式執行例項:

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

列表推導:如下例項快速解析理解

>>> [(user,name) for user in ['bnc','ad','admin'] for name in ['boy','xiaoming','bnc','admin'] if user==name]
[('bnc', 'bnc'), ('admin', 'admin')]
等同
>>> combs = []
>>> for user in ['bnc','ad','admin']:
... for name in ['boy','xiaoming','bnc','admin']:
... if user == name:
... combs.append((user, name))
...

>>> combs
[('bnc', 'bnc'), ('admin', 'admin')]

>>> # call a method on each element
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

連結串列做文字處理矩陣計算:交換行列

#由三個長度為 4 的列表組成的 3x4 矩陣,交換行列

>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
等於
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

3 del語句

 del語句:不同於有返回值的 pop() 方法,其按索引來刪除子項

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4] # 切片
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

4 元組、序列、集合和字典

 元組和列表的區別

元組:不同種類元素,不可變;
列表:相同種類的元素,可變

>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

set集合

特點:set集合是無序不重複元素的集。
基本功能:關係測試和消除重複元素。還支援 union(聯合),intersection(交),difference(差)和 sysmmetric difference(對稱差集)等數學運算。
集合建立:大括號或 set() 函式。注意:空集合的建立必須使用 set() 而不是 {}。{}可以用於建立空字典。

集合例項演示:

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # fast membership testing
True
>>> 'crabgrass' in basket
False

>>> # Demonstrate set operations on unique letters from two words
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # letters in both a and b
{'a', 'c'}
>>> a ^ b # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}

類似 列表推導式,這裡有一種集合推導式語法:

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

字典

字典以 關鍵字 為索引,關鍵字可以是任意不可變型別,通常用字串或數值。字典本質是無序鍵值對 (key:value 對)集合,同一字典內鍵必須是互不相同的。
字典建立: {} 。
主要操作:據鍵儲存和析取值。可用 del 來刪除鍵:值對(key:value)。
排序: sorted(d.keys()) )。
檢查字典:用 in 關鍵字檢查字典中是否存在某個關鍵字。
字典例項演示:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

dict() 建構函式可以直接從 key-value 對中建立字典:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

>>> tel={x:x**2 for x in range(2,12,3)}
>>> list(tel.keys())
[8, 2, 11, 5]
>>> sorted(tel.keys())
[2, 5, 8, 11]

5 迴圈技巧

 字典迴圈,關鍵字和對應的值可以使用 items() 方法同時解讀出來:

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave

在序列中迴圈時,索引位置和對應值可以使用 enumerate() 函式同時得到:

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
print(i, v)
0 tic
1 tac
2 toe

同時迴圈兩個或更多的序列,可以使用 zip() 整體打包:

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
print('What is your {0}? It is {1}.'.format(q, a))
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.

需要逆向迴圈序列的話,先正向定位序列,然後呼叫 reversed() 函式:

>>> for i in reversed(range(1, 10, 2)):
print(i)
9
7
5
3
1

要按排序後的順序迴圈序列的話,使用 sorted() 函式,它不改動原序列,而是生成一個新的已排序的序列:

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
print(f)
apple
banana
orange
pear

若要在迴圈內部修改正在遍歷的序列(例如複製某些元素),建議您首先製作副本。在序列上迴圈不會隱式地建立副本。切片表示法使這尤其方便:

>>> words = ['cat', 'window', 'defenestrate']
# Loop over a slice copy of the entire list.
>>> for w in words[:]:
if len(w) > 6:
words.insert(0, w)
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']

6 參考文獻和推薦資料

相關推薦

Python慢慢資料結構python

作者:白寧超 2016年10月9日14:04:47 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一

Python慢慢快速上手學python

作者:白寧超 2016年10月4日19:59:39 摘要:python語言儼然不算新技術,七八年前甚至更早已有很多人研習,只是沒有現在流行罷了。之所以當下如此盛行,我想肯定是多因素造成了,當然市場需求的重要因素。吳軍博士對大資料流行的解釋與python流行或許有些默契。資料一直以來都存在,只是在歷

Python慢慢(4)模組異常談python

作者:白寧超 2016年10月10日12:08:31 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任

Python慢慢(3)函式修行知python

作者:白寧超 2016年10月9日21:51:52 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一

Python慢慢(5)類的繼承案例解析,python相關知識延伸

作者:白寧超 2016年10月10日22:36:57 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任

caffe原始碼的梳理之一資料結構Blob

Blob資料結構 1、Blob資料結構   caffe使用Blob的4維陣列用於儲存和交換資料,維度從低到高為(width_, height_, channel_,num_)。其中width_和height_分別表示影象的寬和高,channel_表示顏色

重點,要考的資料結構及演算法基礎--雜湊圖(HashMap)

HashMap可以說是java中最常見的幾種集合了。 在瞭解HashMap前我們要先了解Object的兩個方法:Equals和h

Python開發Python基礎之2

對齊方式 dex 字符串 後退 ring lag nic 有效 func 字符串格式化 Python的字符串格式化有兩種方式: 百分號方式、format方式 百分號的方式相對來說比較老,而format方式則是比較先進的方式,企圖替換古老的方式,目前兩者並存。[PEP-310

Python之路:面向對象及相關

訪問 遊戲 font raise 內置 無法 sys 接下來 print 面向對象基礎 基礎內容介紹詳見一下兩篇博文: 面向對象初級篇 面向對象進階篇 其他相關 一、isinstance(obj, cls) 檢查是否obj是否是類 cls 的對象 class F

圖解Python :面向對象-類-初級基礎

value 查找 補充 有變 區分 args exist 發生 type 由於類的內容比較多,分為類-初級基礎篇和類-進階篇 類的內容總覽圖: 本節內容一覽圖: 今天只講類的基礎的面向對象的特性 前言總結介紹: 面向對象是一種編程方式,此編程方式的實

python全棧開發Python可變數據類型和不可變數據類型

字符 數字 布爾類型 post 9.png inf img 改變 不可變類 1.可變數據類型:在id不變的情況下,value可改變(列表和字典是可變類型,但是字典中的key值必須是不可變類型) 2.不可變數據類型:value改變,id也跟著改變。(數字,字符串,布爾類型

Python成長之路Python基礎之文件處理

閱讀 關註 src 文件路徑 程序 opened IT 寫入 文件操作 一、文件操作 1、介紹 計算機系統分為:計算機硬件,操作系統,應用程序三部分。 我們用python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存於硬盤中,這就涉及到應用程序要操作硬件,

Python成長之路Python基礎之裝飾器

brush urn 新功能 clas 現在 hide rom 接收 調用 一、什麽是裝飾器 裝飾:裝飾既修飾,意指為其他函數添加新功能 器:器既函數 裝飾器定義:本質就是函數,功能是為其他函數添加新功能 二、裝飾器需要遵循的原則 1、不能修改裝飾器的源代碼(開放封閉原則)

Python成長之路Python基礎之模塊

module 應用程序 過程 解釋器 amp 之路 Python標準庫 pre 使用 模塊&包 模塊(module)的概念: 在計算機程序開發的過程中,隨著程序代碼越寫越多,在一個文件裏代碼就會越來越長,越來越不容易維護。為了編寫可維護的代碼,我們把很多函數分組,分

Python之路:面向物件及相關 面向物件基礎

其他相關 一、isinstance(obj, cls)  檢查是否obj是否是類 cls 的物件 1 2

Python開發Python基礎之雜貨鋪

字串格式化 Python的字串格式化有兩種方式: 百分號方式、format方式 百分號的方式相對來說比較老,而format方式則是比較先進的方式,企圖替換古老的方式,目前兩者並存。[PEP-3101] This PEP proposes a new system for

MySQL數據庫學習完整性約束

png 唯一約束 not null 會話 glob -- delet 初始 -a 一、介紹 約束條件與數據類型的寬度一樣,都是可選參數 作用:用於保證數據的完整性和一致性主要分為: PRIMARY KEY (PK) 標識該字段為該表的主鍵,可以唯一的標識記錄 FO

web前端JavaScript基礎

嵌入式 搭載 分享 == 出現 scrip 核心 obj python 一、JavaScript的歷史 1992年Nombas開發出C-minus-minus(C--)的嵌入式腳本語言(最初綁定在CEnvi軟件中).後將其改名ScriptEase.(客戶端執行的語言)

Django ORM單表增刪改查

contains 字典 exc 單表 pytho name屬性 作者 包括 刪除數據 一、添加表記錄 對於單表有兩種方式 # 添加數據的兩種方式 # 方式一:實例化對象就是一條表記錄 Frank_obj = models.Student(name ="海

Flask 分頁

__init__ gen object nta container lock main previous boot 一、flask實現的分頁組件 from urllib.parse import urlencode,quote,unquote class Paginat