1. 程式人生 > >第二章:列表與元素

第二章:列表與元素

擴展 不可變 數據結構--棧 需求 帳號 追加 line -h 隱式

本章將引入一個新的概念:數據結構。數據結構是通過某種方式(例如對元素進行編號)組織在一起的數據元素的集合。這些數據元素可以是數字或者字符,甚至可以是其他數據結構。在python中,最基本的數據結構是序列。序列中的每個元素被分配一個序號--即元素的位置,也稱為索引。第一個索引為0,第二個1,以此類推。序列中的最後一個數被標誌為-1,倒數第二個為-2,。。。。

2.1 序列概覽:

python有6種內建的序列,其中常見的兩種序列:列表和元組,其他的有字符串,Unicode字符串,buffer對象和xrange對象
python中還有一種名為容器的數據結構。容器基本上是包含其他數據對象的任意對象。序列(例如列表和元組)和映射(例如字典)是兩列最主要的容器。序列中每個元素都有自己的編號,而映射中的每個元素則有一個名字(也成為鍵)

2.2 通用序列操作

所有序列烈性都可以進行某些特定的操作。這些操作包括:索引、分片、加、乘以及檢查某個元素是否屬於序列的成員。除此之外,python還有計算序列長度、找出最大元素和最小元素的內建函數。還有叠代,即一次對序列中的每個元素重復進行某些操作

2.2.1 索引

序列中的手遊元素都是有編號的---從0開始遞增。這些元素可以通過編號分別進行訪問,如下所示:
以下是一個腳本示例:
輸出如下:

2.2.3 分片

與使用索引來訪問單個元素類似,可以使用分片操作來訪問一定範圍內的元素。分片通過冒號隔開的兩個索引來實現:
步長的概念:進行分片時,分片的開始和結束點需要進行指定(不管是直接還是間接),而另一個參數--步長--通常是隱式設置的。示例如下:
需要註意:1.開始點的元素(最左邊的)包括在結果中,而結束點的元素(最右邊的)則不再分片中2.當使用一個負數作為步長時,必須讓開始點的索引大於結束點3.在沒有明確指定開始與結束點的時候,正負數的使用可能會帶來一些混淆

2.2.3 序列相加

2.2.4 乘法

只能用數字與序列的乘法,原來的序列將會被重復n次
空列表:空列表可以簡單的通過兩個中括號來表示,裏面什麽都沒有。但是如果想創建一個占用10個元素空間,卻不包含任何有效內容的列表,該怎麽辦?可以像前面那樣使用[42]*10或[0]*10,這樣就生成了一個包含10個0的列表None:有時會需要一個值來代表空值,意味著沒有在裏面放置任何元素,這時候就需要使用None。None是python的一個內建值,他的確切含義是“什麽都沒有”。因此,可以用來初始化列表。示例如下:
用代碼打印一個盒子:
輸出如下:

2.2.5 成員資格

為了檢查一個值是否在序列中,可以使用in運算符,用來檢測某個條件是否為主,然後返回相應的值
在Unix系統中,我們可以使用in來檢查用戶是否有某些權限,還可以用來檢測用戶的帳號密碼是否對應的上示例腳本如下:
輸出如下:

2.2.6 長度,最大值,最小值

內建函數len,max,min

2.3 列表

2.3.1 list函數

因為字符串不能像列表一樣修改,索引有時根據字符串創建列表會很有效。list函數

2.3.2 列表的基本操作

1.改變列表:元素賦值
2.刪除元素:del
3.分片賦值:

2.3.3 列表方法

1.追加:append
在列表末尾追加新的元素
2.統計:count
用來統計某個元素在列表中出現的次數
3.擴展:entend
在列表的末尾一次性追加另一個序列的多個值這個操作看起來很想連接操作,兩者最主要的區別在於:extend方法修改了被擴展的序列。而原始的連接則不然,他會返回一個全新的列表
4.索引:index
用於從列表中找出某個值第一個匹配項的索引位置
5.插入:insert
用於將對象插入到列表中
與extend方法類似,insert方法的操作也可以用分片賦值來實現
6.移除:pop
會移除列表中的一個元素(默認是最後一個),並且返回該元素的值
使用pop方法可以實現一種常見的數據結構--棧,即後進先出的移除數據。實現入棧和出棧
7.移除:remove
用於移除列表中某個值的第一個匹配項
可以看到:只有第一次出現的值被移除了,而不存在與列表中的值是不會被移除的值得註意的是:remove是一個沒有返回值的原位置改變方法,他修改了列表卻沒有返回值
8.反向存放:reverse
將列表中的元素反向存放
9.排序:sort
用於在原位置對列表進行排序,從而讓其中的元素能按一定的順序排列,而不是簡單的返回一個已排序的列表副本。sort並不返回排序好的列表!
當用戶需要一個排號序的副本,同時又要求保留列表不變時:第一種方法:
第二種方法:
而使用另一種則不行:
10 高級排序
如果希望元素能夠按照特定的發放時進行排序(而不是sort函數默認的方式,及根據python的默認順序進行排序),那麽就可以通過compare(x,y)的形式自定義比較函數。compare(x,y)會在x<y時返回負數,x>y時返回證書,如果x=y則返回0(根據你自己的定義)。定義好該函數之後,就可以提供給sort方法作為參數了。內建函數cmp提供了比較函數的默認實現方式:cmp函數:
使用cmp參數排序:
sort方法還有另外兩個可選的參數-key和reverse。如果要使用他們,就要通過名字來指定(即關鍵字參數)。參數key與cmp類似--必須提供一個在排序過程中使用的函數。然而,該函數並不是直接用來確定對象的大小,而是為每個元素創建一個鍵,然後所有元素根據鍵來排序。因此,如果要根據元素的長度進行排序,那麽可以使用len作為鍵函數:
使用reverse:
cmp與key、reverse參數都可以作為sorted的函數,在多數情況下,為cmp或key提供自定義函數是非常有用的

2.4 元組:不可變序列

元組與列表一樣,也是一種序列。唯一的不同是元組不能修改。創建元組的語法很簡單,如果你用逗號分割了一些值,那麽它就自動創建了元組。
元組大部分時候是通過圓括號括起來的,空元組可以用沒有包含內容的兩個圓括號來表示,而對於只有一個值的元組,必須加一個逗號,逗號是非常重要的,只添加圓括號是沒用的,如下:

2.4.1 tuple函數

tuple函數功能與list函數基本上是一樣的,以一個序列作為參考並把它轉換為元組,如果參數就是元組,那麽該參數就會被原樣返回:

2.4.2 基本元組操作:

除了創建元組與訪問元組元素之外,因為沒有太多其他操作,可以參照其他類型的序列來實現:

2.4.3 元組的意義何在?

1.元組可以在映射(和集合的成員)中當作鍵使用--而列表不行2.元組作為很多內建函數和方法的返回值存在,也就是說你必須對元組進行處理。只要不嘗試修改元組,那麽,“處理”元組在絕大多數情況下就是把他們當作列表來進行操作一般來說,列表可能更能滿足對序列的所有需求

2.5 小結

函數描述
cmp(x,y)比較兩個數的值
len(seq)返回序列的長度
lsit(seq)把序列轉化為列表
max(args)返回序列或參數集合中的最大值
min(args)返回序列或參數集合中的最小值
reverse(seq)對序列進行反向叠代
sorted(seq)返回已排序的包含seq所有元素的列表
tuple(seq)把序列轉化為元組



第二章:列表與元素