目錄Blog:博客園 個人
- 串列
- 串列的取值
- 通過下標
- 切片
- 用len()取得串列的長度
- 用下標改變串列中的值
- 串列連接和串列復制
- 用 del 陳述句從串列中洗掉值
- in和not in運算子
- 多重賦值
- 串列的取值
- 串列的方法
- 查找
- 增加
- list.append(x)
- list.insert(i, x)
- 洗掉
- 排序
- 串列推導式
- 語法格式
- 例子
- 例1
- 例2
- 常見問題解決方案
- 洗掉序列相同元素并保持順序
- 問題
- 解決
- 找出出現次數最多的元素
- 問題
- 解決方案
- 洗掉序列相同元素并保持順序
串列
Python中沒有陣列,但是加入了更加強大的串列(list),
從形式上看,串列會將所有元素都放在一對中括號[]中,相鄰元素之間用逗號分隔,元素可以為任何型別,如下所示:
[element1,element2,element3,...,elementn]
可以通過type函式查看型別:
>>> type(['sss',2.34,['sds',11],'ab'])
<class 'list'>
串列的取值
通過下標
串列通過下標來獲取串列中的單個值,串列中第一個值的下標是0,第二個值的下標是 1,第三個值的下標是 2,以此類推,例如:
>>> a=[1,2,3,4,'ddd']
>>> a[0]
1
>>> a[4]
'ddd'
>>> a[1.1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not float
Tips:下標只能是整數, 不能是浮點值,否則將導致
TypeError錯誤,
串列也可以包含其他串列值,這些串列的串列中的值, 可以通過多重下標來訪
問, 像這樣:
>>> a=[1,2,[85,'dog'],3,4,'ddd']
>>> a[2][1]
'dog'
雖然下標從0開始并向上增長,但也可以用負整數作為下標,整數值?1指的是
串列中的最后一個下標,?2指的是串列中倒數第二個下標, 以此類推,
>>> a=[1,2,[85,'dog'],3,4,'ddd']
>>> a[-1]
'ddd'
切片
就像下標可以從串列中取得單個值一樣,“切片”可以從串列中取得多個值,結果是一個新串列,像下標一樣, 但它有兩個冒號分隔的整數,第一個數字為切片的起始位置,第二個數字為串列的長度位置,第三個數字為元素的間隔,例如:
>>> a[1:5]
[2, [85, 'dog'], 3, 4]
>>> a[1:5:2]
[2, 3]
可以省略切片中冒號兩邊的一個下標或兩個下標,省略第一個下標相當于使用0,或串列的開始,省略第二個下標相當于使用串列的長度,意味著分片直至串列的末尾,例如:
>>> a[:3]
[1, 2, [85, 'dog']]
>>> a[1:]
[2, [85, 'dog'], 3, 4, 'ddd']
>>> a[-2:]
[4, 'ddd']
用len()取得串列的長度
len()函式將回傳傳遞給它的串列中值的個數,就像它能計算字串中字符的個數一樣,在互動式環境中輸入以下代碼:
>>> len(a)
6
用下標改變串列中的值
可以使用串列的下標來改變下標處的值,例如:
>>> a
[1, 2, [85, 'dog'], 3, 4, 'ddd']
>>> a[3]='cat'
>>> a
[1, 2, [85, 'dog'], 'cat', 4, 'ddd']
串列連接和串列復制
+運算子可以連接兩個串列,得到一個新串列,就像它將兩個字串合并成一新字串一樣,*運算子可以用于一個串列和一個整數,實作串列的復制,
>>> [1,2,3] + ['a','b','c']
[1, 2, 3, 'a', 'b', 'c']
>>> [1,2,3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
用 del 陳述句從串列中洗掉值
del陳述句將洗掉串列中下標處的值,表中被洗掉值后面的所有值,都將向前移動一個下標,
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> del a[2]
>>> a
[1, 2, 'a', 'b', 'c']
in和not in運算子
利用in和not in運算子,可以確定一個值否在串列中,像其他運算子一樣,in和not in用在運算式中,連接兩個值:一個要在串列中查找的值, 以及待查找的串列,這些運算式將求值為布林值,
>>> a = ['cat','dog','pig']
>>> 'pig' in a
True
>>> 'bird' in a
False
多重賦值
>>> a = ['cat','dog','pig']
>>> x,y,z=a
>>> x
'cat'
>>> y
'dog'
>>> z
'pig'
但變數數和串列中元素數量不符時,會報ValueError
>>> a = ['cat','dog','pig','fish']
>>> x,y,z = a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
有時候,你可能只想解壓一部分,丟棄其他的值,對于這種情況Python并沒有提供特殊的語法, 但是你可以使用任意變數名去占位,到時候丟掉這些變數就行了,
>>> a = ['cat','dog','pig','fish']
>>> _,x,y,_ = a
>>> x
'dog'
>>> y
'pig'
串列的方法
常用方法:增、刪、改、查、排序,
查找
串列值有一個index()方法,可以傳入一個值,如果該值存在于串列中,就回傳它的下標,如果該值不在串列中,Python 就報ValueError,
>>> a = ['cat','dog','pig']
>>> a.index('dog')
1
>>> a.index('bird')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'bird' is not in list
增加
方法有:list.append(x),list.insert(i, x)
list.append(x)
在串列的末尾添加一個元素,相當于a[len(a):] = [x],
>>> a = ['cat','dog','pig']
>>> a.append('bird')
>>> a
['cat', 'dog', 'pig', 'bird']
list.insert(i, x)
在給定的位置插入一個元素,第一個引數是要插入的元素的索引,所以a.insert(0, x)插入串列頭部, a.insert(len(a), x)等同于a.append(x),
>>> a.insert(2,'fish')
>>> a
['cat', 'dog', 'fish', 'pig', 'bird']
洗掉
給remove()方法傳入一個值,它將從被呼叫的串列中洗掉,
>>> a.remove('cat')
>>> a
['dog', 'fish', 'pig', 'bird']
Tips:如果知道想要洗掉的值在串列中的下標,
del陳述句就很好用,如果知道想要從串列中洗掉的值,remove()方法就很好用,
排序
數值的串列或字串的串列,能用sort()方法排序,
>>> a=['cat', 'dog', 'fish', 'pig', 'bird']
>>> a.sort()
>>> a
['bird', 'cat', 'dog', 'fish', 'pig']
需要注意的是
sort()方法當場對串列排序,不要寫出a = a.sort()這樣的代碼,試圖記錄回傳值,- 不能對既有數字又有字串值的串列排序,因為 Python不知道如何比較它們,否則會報
TypeError錯誤,
>>> a = ['cat',1,3,'fish']
>>> a.sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'str'
sort()方法對字串排序時,使用“ASCII字符順序”,而不是實際的字典順序,這意味著大寫字母排在小寫字母之前,因此在排序時,小寫的a在大寫的Z之后,
>>> a=['dog','Big','Small','fish']
>>> a.sort()
>>> a
['Big', 'Small', 'dog', 'fish']
串列推導式
串列推導式用于使用其他串列創建一個新串列,
語法格式
如下:
# 格式1
[運算式 for 變數 in 串列]
# 格式2,對串列進行判斷篩選
[運算式 for 變數 in 串列 if 條件]
例子
例1
# 求1-9的平方組成的串列
l = [x**2 for x in range(1, 10)]
print(l)
結果如下:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
例2
# 求1-9中偶數的平方組成的串列
l = [x**2 for x in range(1, 10) if x % 2 == 0]
print(l)
結果如下:
[4, 16, 36, 64]
常見問題解決方案
洗掉序列相同元素并保持順序
問題
怎樣在一個串列上面保持元素順序的同時消除重復的值?
解決
去重可以用not in判斷,排序可以用sort方法,
def dedupe(items):
seen = []
for item in items:
if item not in seen:
seen.append(item)
seen.sort()
return seen
使用上述函式驗證
>>> a = [1515,23,546,77,34,666,23,12,546]
>>> dedupe(a)
[12, 23, 34, 77, 546, 666, 1515]
>>> b = ['dog','pig','cat','fish','bird','pig','fish']
>>> dedupe(b)
['bird', 'cat', 'dog', 'fish', 'pig']
>>> c = ['dog','pig','cat','fish','bird','pig','fish',123]
>>> dedupe(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in dedupe
TypeError: '<' not supported between instances of 'int' and 'str'
Tips:不能對既有數字又有字串值的串列排序,因為 Python不知道如何比較它們,否則會報
TypeError錯誤,
找出出現次數最多的元素
問題
怎樣找出一個串列中出現次數最多的元素呢?
解決方案
collections.Counter 類就是專門為這類問題而設計的, 它甚至有一個有用的 most_common() 方法直接給了你答案,
>>> from collections import Counter
>>> animals = [
... 'cat', 'bird', 'dog', 'cat', 'fish', 'dog',
... 'pig', 'pig', 'monkey', 'lion', 'tiger', 'bird',
... 'duck', 'fish', 'monkey', 'bird', 'dog', 'lion',
... 'cat', 'tiger'
... ]
>>> animal_counts = Counter(animals)
>>> top_animal = animal_counts.most_common(1)
>>> top_animal
[('cat', 3)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/139935.html
標籤:Python
