python列表

4.1 列表數據類型
“列表”是一個值,它包含多個字構成的序列。術語“列表值”指的是列表本身,而不是指列表值之內的那些值。列表中的值也稱爲“表項”。表項用逗號分隔。列表用左方括號開始,右方括號結束,即[]。

4.1.1 用下標取得列表中的單個值
假定列表['cat','bat','rat','elephant']保存在變量spam中。python代碼spam[0]將求值爲'cat',spam[1]將求值爲'bat',以此類推。列表後的方括號內的整數被稱爲“下標”。列表的第一個下標是0。下標只能是整數。

列表也可以包含其他列表值。這些列表的列表中的值,可以通過多重下標來訪問。

spam= [['cat','bat'],[10,20,30,40,50]]
spam[0]
['cat', 'bat']
spam[0][1]
'bat'
spam[1][4]
50

4.1.2 負數下標
雖然下標從0開始並向上增長,但也可以用負整數作爲下標。整數值-1指的是列表中的最後一個下標,-2指的是列表中的倒數第二個下標,以此類推。

4.1.3 利用切片取得子列表
切片可以從列表中取得多個值,結果是一個新列表。切片輸入在一對方括號中,像下標一樣,但他有兩個冒號分隔的整數。

spam[2]是一個列表和下標(一個整數)
spam[1:4]是一個列表和切片(兩個整數)
在一個切片中,第一個整數是切片開始處的下標,第二個整數是切片結束處的下標。切片向上增長,直至第二個下標的值,但不包括它。

4.1.4 用len()取得列表的長度
len()函數將返回傳遞給他的列表中值得個數,就像他能計算字符串中字符串的個數一樣。

spam=['cat','dog','moose']
len(spam)
3

4.1.5 用下標改變列表中的值
一般情況下,賦值語句左邊是一個變量名,就像spam=4.但是,也可以使用列表的下標來改變下標處的值。

spam=['cat','dog','moose']
spam[1] = 'bat'
spam
['cat', 'bat', 'moose']

4.1.6 列表的連接和複製
+操作符可以連接兩個列表,得到一個新的列表。*操作符可以用於一個列表和一個整數,實現列表的複製,得到一個新列表。

4.1.7 用del語句從列表中刪除值
del語句將刪除列表中下標處的值,表中被刪除值後面的所有值,都將向前移動給一個下標。

spam=['cat','dog','moose']
del spam[1]
spam
['cat', 'moose']

del語句也可以用於刪除一個簡單變量,之後該變量將不再存在。

4.2 使用列表
一個python技巧,在for循環中使用range(len(someList)),迭代列表的每一個下標。

supplies = ['pen','staplers','flam_throwers','binders']
for i in range(len(supplies)):
print('Index '+ str(i) + ' in supplies is: '+supplies[i])

Index 0 in supplies is: pen
Index 1 in supplies is: staplers
Index 2 in supplies is: flam_throwers
Index 3 in supplies is: binders

4.2.1 in和not in操作符
利用in和not in操作符,可以確定一個值是否在列表中。像其他操作符一樣,in和not in用在列表中,連接兩個值:一個要在列表中查找的值以及待查找的列表。這些表達式將求值爲布爾值。

spam=['cat','dog','moose']
'cat' in spam
True
cat not in spam
False

4.2.2 多重複值技巧
多重賦值技巧是一種快捷方式,讓你在一行代碼中,用列表中的值爲多個變量賦值.變量的數目和列表的長度必須相等。

cat = ['fat','black','loud']
size, color,disposition = cat
4.3 方法
方法和函數是一回事,只是它調用在一個值上。每種數據類型都有他自己的一組方法。

4.3.1 index()在列表中查找值
列表值有一個index()方法,可以傳入一個值,如果該值存在於列表中,就返回它的下標。如果該值不在列表中,python就報ValueError。如果列表中存在重複的值,他就返回它第一次出現的下標。

spam=['cat','dog','moose']
spam.index('cat')
0
4.3.2 用appen()和inser()方法在列表中添加值
append()方法將參數添加到列表末尾。 insert()方法可以在列表的任意下標處插入一個值。insert()方法的第一個參數是新值的下標,第二個參數是要插入的新值。

方法屬於單個數據類型。append()和insert()方法是列表方法,其返回值是None,只能在列表上調用,不能在其他值上調用。

4.4.3 用remove()方法從列表中刪除值
給remove()方法傳入一個值,它將從被調用的列表中刪除。

spam=['cat','dog','moose']
spam.remove('cat')
spam
['dog', 'moose']

如果該值在列表中出現多次,只有第一次出現的值會被刪除。

4.4.4 用sort()方法將列表中的值排序
數值的列表或字符串的列表,能用sort()方法排序,可以指定關鍵字reverse=Tue讓sort()逆序排序

sort()方法對字符串排序時,使用“ASIC2字符順序表”,如果需要按照普通的字典順序來排序,可以在調用sort()方法時,將關鍵字參數key設置爲str.lower.

spam = [2,5,-14,-7,12,3]
spam.sort()
spam
[-14, -7, 2, 3, 5, 12]
spam.sort(reverse=False)
spam
[-14, -7, 2, 3, 5, 12]
spam.sort(reverse=True)
spam
[12, 5, 3, 2, -7, -14]

spam=['a','Z','A','Z']
spam.sort(key=str.lower)
spam
['a', 'A', 'Z', 'Z']

4.5 類似列表的類型:字符串和元組
列表並不是唯一表示序列值的數據類型。對於列表的許多操作,也可以作用於字符串:按下標取值,切片,用於for循環,用於len()以及用於in和not in操作符

name='Zophie'
name[0]
'Z'
name[-2]
'i'
name[0:4]
'Zoph'
'Zo' in name
True
'p' not in name
False
for i in name:
print(' ' + i + ' ')

    • Z
    • o
    • p
    • h
    • i
    • e

      4.5.1 可變和不可變數據類型
      列表是“可變的”數據類型,它的值可以添加,刪除或者改變。但是字符串是“不可變的”。
      “改變”一個字符串的正確方式,是使用切片和連接。構造一個“新的”字符串。

4.5.2 元組數據類型
除了一下幾點元組數據類型和列表一樣。

元組輸入時用圓括號(),而不是用方括號[]
元組像字符串一樣是不可變的。
如果元組中只有一個值,你可以在括號內該值的後面跟上一個逗號,表明這個情況。
4.5.3 用list()和tuple()函數來轉換類型
list()可以將返回值傳遞給它們的值的列表
tuple()可以將返回值傳遞給它們的值的元組

spam=['a','Z','A','Z']
tuple(spam)
('a', 'A', 'Z', 'Z')
list(spam)
['a', 'A', 'Z', 'Z']

4.6 引用
當將列表賦值給一個變量時,實際上是將列表的“引用”賦給了該變量。 在變量必須保存可變數據類型的值時,例如列表或者字典,python就使用引用。對於不可變得數據類型值,例如字符串,整型或元組,python變量就保存值本身。

4.6.1 傳遞引用
當函數被調用時,參數的值就被賦值給變元,對於列表以及字典,這意味着變元得到的是引用拷貝。

def eggs(someParameter):
someParameter.append('Hello')

spam = [1, 2, 3]
eggs(spam)
print(spam)

[1,2,3,'Hello']

4.6.2 copy模塊的copy()和deepcopy()函數
copy模塊包含copy()和deepcopy()函數,第一個函數copy.copy(),可以用來複制列表或者字典這樣的可變值,而不是複製引用。

如果複製的列表中包含了列表,那就使用copy.deepcopy()函數來替代。deepcopy()函數將同時複製他們內部的列表。

import copy
spam=['A','B','C','D']
cheese =copy.copy(spam)
cheese [1]=42
spam
['A', 'B', 'C', 'D']
cheese
['A', 42, 'C', 'D']

4.7 實踐
4.7.1逗號代碼
假定有下面這樣的列表: spam = ['apples', 'bananas', 'tofu', 'cats']

編寫一個函數,它以一個列表值作爲參數,返回一個字符串。該字符串包含所 有表項,表項之間以逗號和空格分隔,並在最後一個表項之前插入and。例如,將前面的 spam 列表傳遞給函數,將返回'apples, bananas, tofu, and cats'。但你的函數應該能夠處理傳遞給它的任何列表。

代碼如下:

def change(listValue):
listValue[-1] = 'and ' + listValue[-1]
print(','.join(listValue))

spam = ['apples', 'bananas', 'tofu', 'cat']

change(spam)
4.7.2字符網格
假定有一個列表的列表,內層列表的每個值都是包含一個字符的字符串,像這樣:

grid = [['.', '.', '.', '.', '.', '.'],

   ['.', 'O', 'O', '.', '.', '.'],

   ['O', 'O', 'O', 'O', '.', '.'],

   ['O', 'O', 'O', 'O', 'O', '.'],

   ['.', 'O', 'O', 'O', 'O', 'O'],

   ['O', 'O', 'O', 'O', 'O', '.'],

   ['O', 'O', 'O', 'O', '.', '.'],

   ['.', 'O', 'O', '.', '.', '.'],

   ['.', '.', '.', '.', '.', '.']]

你可以認爲grid[x][y]是一幅“圖”在x,y座標處的字符,該圖由文本字符組成。原點(0,0)在左上角,向右x座標增加,向下y座標增加。複製前面的網格值,編寫代碼用它打印圖像。

..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....
提示:你需要使用循環嵌套循環,打印出grid[0][0],然後grid[1][0],然後grid[2][1],以此類推,知道grid[8][0]。這就完成第一行,所以接下來打印換行。然後程序將打印出grid[0][1],然後grid[1][1],然後grid[2][1],以此類推。程序最後將打印出grid[8][5]。 而且,如果你不希望在每次print()調用後都自動打印換行,記得向print()傳遞end關鍵字參數。

代碼如下:

grid = [['.', '.', '.', '.', '.', '.'],

   ['.', 'O', 'O', '.', '.', '.'],

   ['O', 'O', 'O', 'O', '.', '.'],

   ['O', 'O', 'O', 'O', 'O', '.'],

   ['.', 'O', 'O', 'O', 'O', 'O'],

   ['O', 'O', 'O', 'O', 'O', '.'],

   ['O', 'O', 'O', 'O', '.', '.'],

   ['.', 'O', 'O', '.', '.', '.'],

   ['.', '.', '.', '.', '.', '.']]

for y in range(len(grid[0])):
for x in range(len(grid)):
print(grid[x][y], end='')
print('\n')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章