《Python基礎教程》第2章 列表和元組

序列概覽

在Python中最基本的數據結構是序列(sequence)。序列共有6種類型,本章只重點討論兩種:列表和元組。該章的大致結構為:

  • 通用序列操作
  • 列表
  • 元組

通用序列操作

所有的序列都能進行某些特定的操作,并且Python還帶有計算長度、尋找最大和最小元素等功能的內建方法。

索引

序列總所有的元素都是帶編號的,0表示從第一位開始,-1表示從最后一位開始。字符串就是一個由字符組成序列:

>>> greeting = "Hello"
>>> greeting[0]
'H'
>>> "Hello"[-1]
'o'   

接下來該書實例給了一個小程序。當做練習個人簡單把要求抽象一下,如果你也是同我一樣剛剛入門Python可以試著自己編編看:

要求用戶輸入年、月(1-12)、日(1-31),然后按照形如:September 12th,2014 的格式輸出構建的字符串。

如下是自己構建的一段代碼以及相應的輸入輸出結果:

year = raw_input("Year:")
month = raw_input("Month(1-12):")
day = raw_input("Day(1-31):")

monthes = [
    "January",
    "February",
    "March",
    "April",
    "Ma",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
]
#此處個人對英文位數的后綴表示法理解有偏差
days = ['st', 'rd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th'];

print monthes[int(month) - 1] + ' ' + day + days[int(day) - 1] + ',' + year

執行即可看到如下結果:

$ python sequencePractise.py
Year:2015
Month(1-12):1
Day(1-31):5
January 5th,2015

相比之教程上的代碼,有些東西是可以改進的
(1)在英文表達習慣中第1-3的后綴是st、nd、rd, 其余則是th。比如:1st、12nd、23rd、15th。
(2)因為還沒有學習分支(if else)所以這里用了一個長度為31的元組來用于后綴的使用。在Python中可以使用數組的拼接(跟Java和JavaScript比起來是新鮮的東西),如下:
days = ['st', 'nd', 'rd'] + 7*['th']+['st', 'nd', 'rd'] + 7*['th']+['st', 'nd', 'rd'] + 7*['th']+['st'] + ['st']

分片

分片簡而言之就是指定開始索引、結束索引,然后得到一個子序列的操作。因為Python提供的分片操作非常靈活,一個一個介紹未必繁瑣,下面列出書中的例子。可以先看輸入猜測輸出,再實際操作或者看結果來印證:

> numbers = [1,2,3,4,5,6,7,8,9,10]
> numbers[3:6]   
[4, 5, 6] #注意索引為6的數字沒有算在內

> numbers[-3:-1]  
[8, 9]

> numbers[-3:0]   
[] #第二個索引位置在第一個索引位置的前面

> numbers[-3:] 
[8,9,10]

> numbers[:-3] 
[1,2,3,4,5,6,7]

> numbers[:] 
[1,2,3,4,5,6,7,8,9,10] # 結果相當于復制整個序列

> numbers[0:10:2] 
[1, 3, 5, 7, 9]#第三個參數為步長

> numbers[8:3:-1]  
[9, 8, 7, 6, 5]#步長可以為負數,索引大小也要反過來

> numbers[0:10:-2] 
[]

> numbers[8::-2] 
[9, 7, 5, 3, 1]
> numbers[5::-2] 
[6, 4, 2]
> numbers[:5:-2] 
[10,8]
#如上三個例子可以知道當其中一個索引沒傳值的時候,會根據步長的正負來設置默認的索引值。
并且注意:索引所指向的值不包含在切片結果中。
序列相加
> [1,2,3]+[4,5,6]  
[1, 2, 3, 4, 5, 6]

> "Hello" + " World" 
"Hello World"

> "Hello" + [1,2,3]  
#結果:error,序列是分類型的,只有同類型的序列才能相加
乘法

數字乘以序列會生成一個新的序列,新序列中原先的內容被重復若干次。

> "Python"*3
"PythonPythonPython"

> [42]*5
[42, 42, 42, 42, 42]
是否包含成員

使用in運算符可以檢測一個知道是否包含在序列中:
> permission = 'rw'
> 'w' in permission
True

> users = ['admin', 'root']
> raw_input('Enter your name:') in users
Enter your name:admin
True
長度、最小值和最大值
>>> numbers = [823, 428, 105]
>>> len(numbers)
3
>>> max(numbers)
823
>>> min(numbers)
105
>>> max(6,3,9,5)
9 #max、min也可以傳入多個參數來獲取最大最小值

列表

列表是可變的,并且有很多有用的、專門的方法。

list函數

函數不只是能對字符串使用,對所有類型的序列都能用。如下為根據字符串創建列表的例子:

>>> list("Hello")
['H', 'e', 'l', 'l', 'o']
基本的列表操作

列表是序列的一種,那么所有序列的操作都是用于列表,不同在于列表可以改變,該部分介紹改變列表的方法:元素賦值、元素刪除、分片賦值、列表方法(并非所有列表方法都能改變列表)。

  • 元素賦值
>>> x=[1,1,1]
>>> x[1]=2
>>> x
[1, 2, 1]
  • 刪除元素
>>> names = ['John', 'Swift', 'Skylar']
>>> del names[1]
>>> names
['John', 'Skylar']
  • 切片賦值
>>> name = list('Perl')
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']

>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
#在這里我們使用了不等長的列表進行切片替換。

>>> numbers = [1,5]
>>> numbers[1:1] = [2,3,4]
>>> numbers
[1, 2, 3, 4, 5]
#這里起到了插入新元素的作用

>>> numbers = [1,2,3,4,5]
>>> numbers[1:4]=[]
>>> numbers
[1, 5]
#這里起到了刪除元素的作用。結合利用步長、負數可以有更多花樣。
列表方法
  • append
> [1,2,3].append(4)
[1,2,3,4]
  • count
> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2
  • extend
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)
a
[1, 2, 3, 4, 5, 6]
#可以看到a發生了改變,這是與直接使用a+b不同的。

當然該方法可以有別的如下兩種替代辦法:

> a = a + b
> a[len(a):] =  b
  • index
['to', 'be', 'or', 'not', 'to', 'be'].index('or')
2
  • insert
>>> numbers = [1, 2, 3, 4]
>>> numbers.insert(2, 'three')
>>> numbers
[1, 2, 'three', 3, 4]

如上操作也等價于切片操作:

>>> numbers[3:3]=['three']
  • pop
>>> numbers = [1,2,3]
>>> numbers.pop()
3
>>> numbers
[1, 2]

實現棧這種結構就可以通過結合使用(append和pop這兩個方法來實現)。實現隊列的話,則可以通過給pop和append添加為0的下標作為第一個參數。

  • remove
>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']

如上移除的為第一個匹配項。

  • reverse
>>> x = [1, 2, 3]
>>> x.reverse()
>>> x
[3, 2, 1]
  • sort
>>> x = [4,7,2,1,7,9]
>>> x.sort()
>>> x
[1, 2, 4, 7, 7, 9]

該書在介紹如上絕大多數方法中都提到了(1)是否返回值(2)是否改變列表本身。個人覺得缺乏使用經驗之前想要記憶住這些東西沒有實際意義,真正使用的時候通過命令行簡單測驗就可以知道。

  • 高級排序

如果希望按照自己定義的規則對列表進行排序,需要傳遞compare方法給sort,sort默認使用的是內建函數cmp(大于返回1,小于返回-1,等于返回0)。此處暫不詳細敘述,原理跟Java應該是一樣的。

>cmp(94, 39)
1

元組:不可變序列

如下列出了元組的常用表示法:

>1, 2, 3
(1, 2, 3)
>(1, 2, 3)
(1, 2, 3)
>()
()
> 42,
(42,)
> (42,) * 3
(42, 42, 42)
tuple函數

tuple是將序列轉化為元組的函數,和列表總的list類似:

>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple('hello')
('h', 'e', 'l', 'l', 'o')
元組基本操作

創建、訪問、切片操作都和列表類似。

元組存在的意義

一般來說,列表能夠滿足絕大多數的需要。書中所提及元組存在的意義,現在還體會不深,暫且不管。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 數據結構,是指通過某種方式(例如對元素進行編號)組織在一起的數據元素的集合,這些數據元素可以是數字或者字符,甚至可...
    千釋炎閱讀 797評論 0 0
  • 第2章 列表和元組 ![](http://picture-repository-of-heamon7.qiniud...
    heamon7閱讀 271評論 0 2
  • 今天做了兩個嘗試: 1 第一次出去拍外景 2 拍完外景請照相的張師傅喝咖啡(順便套路) 拍外景一是找工作要用,二是...
    夏齁咸閱讀 267評論 0 1
  • 每次一打開微信就想看看你有沒有給我發消息,然而卻沒有。忍住想找你的沖動,心里只有一陣陣難過
    Diana心情日記閱讀 227評論 0 0
  • 人生有很多種姿態,應對大千世界凡多事變、形形色色的人兒。人生所有的經歷又都可以概括為悲欣交集,緣人間事離不開愛恨糾...
    將離丶閱讀 432評論 1 3