目錄
一、串列的創建
二、串列的訪問
1.索引
2.切片
三、對于串列的有關操作(增、刪、改、查)
1.在串列中添加元素
2.洗掉list中的元素
3.修改串列中的值
4.串列的有關查詢操作
四、串列的排序
1.sorted函式
2.sort方法
五、串列的嵌套
六、串列的高級應用
1.多維串列排序
2.串列推導式
3.構造多維串列
七、練習
八、第十課練習答案
串列是可變的序列(串列中可以存盤多個資料,且可以對其中的資料進行新增、洗掉、修改和查詢),串列是常用來存盤同類專案的集合,
animals = ['bear','tiger','zebra','elephant'] #這是一個串列,可以將它理解為容器
一、串列的創建
1.names_of_students = [] # 創建一個空串列
2.name of department = ['資訊工程學院'] # 包含1個元素
3.names_of_majors = ['軟體技術','物聯網應用技術','計算機網路技術'] # 以逗號分割專案,包含3個元素
4.words = [x for x in 'abc'] # 使用串列推導式將可迭代物件轉為串列
5.numbers = list('123456789') # 使用型別建構式將可迭代物件轉為串列,
二、串列的訪問
要訪問串列中的值有索引和切片兩種方式,(是不是感覺有些熟悉?是的,之前的字串也是如此,)
1.索引
如何獲得animals中的tiger?
串列中根據每個元素所在的下標取值就是索引,類似字串,下標不是從1開始,而是從0開始,如果你想要2,那你的大腦中就應該想到第2位的下標是1,
?
在串列中根據索引取值:串列名稱[下標],
>>>print(animals[1])
tiger
>>>for index in range(len(animals)):
... print(animals[index])
bear
tiger
zebra
elephant
2.切片
>>>names_of_majors = ['軟體技術','物聯網應用技術','計算機網路技術']
>>>names_of_majors[1:3]
['物聯網應用技術', '計算機網路技術']
>>>numbers = [1,2,3,4,5,6,7,8,9,0]
>>>print(numbers[2:4]) # 從索引2到4(不包含4)之間的值
[3, 4]
>>>print(numbers[5:]) # 從索引5到結束
[6, 7, 8, 9, 0]
>>>print(numbers[-2:]) # 從右側倒數第二開始到結束
[9, 0]
>>>print(numbers[0:9:3]) # 從索引0到9(不包含9),每隔3個元素取1個值
[1,4,7]
三、對于串列的有關操作(增、刪、改、查)
1.在串列中添加元素
(1)append方法
append將元素追加到最后,每次添加一個元素,格式為s.append(x),x可以是任意數值型別,
>>>animals = ['bear','tiger','zebra','elephant']
>>>animals.append('crocodile')
>>>animals
['bear', 'tiger', 'zebra', 'elephant', 'crocodile']
還有一點需要注意的是,在python的官方檔案中提到s.append('x')等同于s[len(s):len(s)]=['x'],而s[len(s)]=['x']則會出現錯誤提示“list assignment index out of range”,這是因為索引方法只對已有下標有效,而s[len(s):len(s)]=['x']使用的是切片方法,可以突破已有下標的限制,
(2)insert方法
insert將元素插入到指定位置,格式為s.insert(i,x),i為插入位置的下標,x可以是任意數值型別,s.insert(i,x)等同于s[i:i]=x,
插入數值
>>>s=[1,2,3,4,5]
>>>s.insert(0,0)
>>>s
[0, 1, 2, 3, 4, 5]
插入串列
>>>s=[1,2,3,4,5]
>>>s.insert(3,[1,2])
>>>s
[1, 2, 3, [1, 2], 4, 5]
插入字典
>>>s=[1,2,3,4,5]
>>>s.insert(3,{'a':3})
>>>s
[1, 2, 3, {'a': 3}, 4, 5]
插入元組
>>>s=[1,2,3,4,5]
>>>s.insert(3,(0,0,0))
>>>s
[1, 2, 3, (0, 0, 0), 4, 5]
(3)extend方法
作用是實作兩個串列的連接,格式為list1.extend(list2),等效于list1+=list2或者list1[len(list1):len(list1)]=list2,
#
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s.extend(t)
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s+=t
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s[len(s):len(s)]=t
>>>s
[1, 2, 3, 4, 5, 4, 5, 6]
>>>s=[1,2,3,4,5]
>>>t=[4,5,6]
>>>s.extend(t[-2:])
>>>s
[1, 2, 3, 4, 5, 5, 6]
2.洗掉list中的元素
(1)del函式
>>>s=[1, 2, 3, 4, 5, 5, 6]
>>>del s[0] # 洗掉指定索引的值
>>>s
[2, 3, 4, 5, 5, 6]
>>>del s[:2] # 洗掉切片區域內的值
>>>s
[4, 5, 5, 6]
>>>del s[:] # 洗掉全部的值
>>>s
[]
(2)clean方法
洗掉list中的所有元素,等同于del s[:],
>>>words=['a','b','c','d']
>>>words
['a', 'b', 'c', 'd']
>>>words.clear()
>>>words
[]
(3)remove方法
根據值洗掉串列中與其相同的第一個元素,
>>>words=['a','b','c','b','d']
>>>print(words)
['a','b','c','b','d']
>>>words.remove('b')
>>>print(words)
['a','c','b','d']
(4)pop方法
根據索引洗掉串列中的元素,同時回傳洗掉的元素,格式為s.pop(i),i是索引值,預設時默認為-1,即洗掉串列中的最后一個值,
>>>numbers = [1,2,3,4,5,6]
>>>number1 = numbers.pop()
>>>print(number1)
6
>>>print(numbers)
[1, 2, 3, 4, 5]
>>>number2 = numbers.pop(1)
>>>print(number2)
2
>>>print(numbers)
[1, 3, 4, 5]
思考:如何洗掉串列中所有的'b',
3.修改串列中的值
(1)利用索引和切片修改串列中的值
>>>odd_numbers = [1,3,5,'aa',9]
>>>odd_numbers[3] = 7 # 修改單個值
>>>odd_numbers
[1, 3, 5, 7, 9]
>>>odd_numbers[0:3] = [2,2,2] # 修改多個值,切片長度和替換值的數量相等,原有串列長度不變
>>>odd_numbers
[2, 2, 2, 7, 9]
>>>odd_numbers[0:2] = [3,3,3] # 修改多個值,切片長度小于替換值的數量,原有串列長度變大
>>>odd_numbers
[3, 3, 3, 2, 'aa', 9]
>>>odd_numbers[0:3] = [1,2,3,4] # 修改多個值,切片長度小于替換值的數量,原有串列長度再次變大
>>>odd_numbers
[1, 2, 3, 4, 2, 'aa', 9]
>>>odd_numbers[::2] = ['bb','cc','dd','ee'] # 根據步長修改串列中的元素
>>>odd_numbers
['bb', 2, 'cc', 4, 'dd', 'aa', 'ee']
>>>odd_numbers[0:4] = ['aa'] # 修改多個值,切片長度大于替換值的數量,原有串列長度變小
>>>odd_numbers
['aa', 'dd', 'aa', 'ee']
(2)列用for回圈和索引修改串列中的值
將['aa', 'dd', 'aa', 'ee']中的'aa'修改為'cc'
>>>odd_numbers = ['aa', 'dd', 'aa', 'ee']
>>>for i in range(len(odd_numbers)):
... if odd_numbers[i] == 'aa':
... odd_numbers[i] = 'cc'
...
>>>print(odd_numbers)
['cc', 'dd', 'cc', 'ee']
4.串列的有關查詢操作
# 是否包含某個元素?
>>>odd_numbers = ['cc', 'dd', 'cc', 'ee']
>>>if 'cc' in odd_numbers:
... print(True)
True
# 串列中有幾個'cc'
>>>odd_numbers.count('cc')
2
>>>odd_numbers.count('aa')
0
# 回傳串列中某個元素的索引值
>>>odd_numbers.index('cc')
0
odd_numbers.index('aa') # 如果串列中不包含這個元素,則出現例外
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: 'aa' is not in list
# 獲取串列的長度
>>>len(odd_numbers)
4
# 查找串列中的最大值
>>>max(odd_numbers)
'ee'
# 查找串列中的最小值
>>>min(odd_numbers)
'cc'
四、串列的排序
1.sorted函式
sorted是python的內建函式,可以對所有可迭代物件進行排序,使用sorted對串列進行排序將得到一個新的串列,而原串列不會改變,sorted函式的語法:sorted(iterable, key=None, reverse=False)
iterable:可迭代物件
key:主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自于可迭代物件中,指定可迭代物件中的一個元素來進行排序,(關于key的使用詳見本文第六部分 串列的高級應用)
reverse:排序規則,reverse = True 降序 , reverse = False 升序(默認),
>>>odd_numbers = [7,1,3,9,5]
>>>sorted(odd_numbers) # 簡單排序,默認為升序
[1, 3, 5, 7, 9]
>>>odd_numbers
[7, 1, 3, 9, 5]
>>>sorted(odd_numbers,reverse = True) # 降序
[9, 7, 5, 3, 1]
# 獲得排序后的串列
>>>sorted_odd_numbers = sorted(odd_numbers,reverse = True)
>>>sorted_odd_numbers
[9, 7, 5, 3, 1]
2.sort方法
sort是串列的一種方法,使用它將直接改變原有串列,sort方法的語法:list.sort( key=None, reverse=False),key和reverse的作用與sorted函式相同,
from random import randint
numbers = []
for i in range(10):
numbers.append(randint(0,101))
print(numbers)
[74, 34, 20, 30, 35, 80, 60, 95, 20, 4]
numbers.sort()
print(numbers)
[4, 20, 20, 30, 34, 35, 60, 74, 80, 95]
numbers.sort(reverse=True)
print(numbers)
[95, 80, 74, 60, 35, 34, 30, 20, 20, 4]
五、串列的嵌套
串列的嵌套即在串列中在嵌套串列,如下所示:
>>>data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
>>>data
[['Tom', 21, '20202501'], ['Jim', 20, '20181717'], ['Susan', 19, '20201908']]
>>>len(data)
3
data中包含有3個子串列,每個子串列包含有姓名、年齡和學號三個資訊,
獲得Jim的所有資訊
>>>data[1]
['Jim', 20, '20181717']
獲得Jim的年齡
>>>data[1][1]
20
修改Jim的學號
>>>data[1][2] = '20181720'
>>>data
[['Tom', 21, '20202501'], ['Jim', 20, '20181720'], ['Susan', 19, '20201908']]
將性別添加到年齡后面
>>>data[0].insert(2,"男")
>>>data[1].insert(2,"男")
>>>data[2].insert(2,"女")
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720'], ['Susan', 19, '女', '20201908']]
將Susan的資訊從串列中洗掉
>>>data.pop()
['Susan', 19, '女', '20201908']
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720']]
或者
>>>del data[-1]
>>>data
[['Tom', 21, '男', '20202501'], ['Jim', 20, '男', '20181720']]
洗掉所有學號資訊
data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
for i in data:
i.pop()
print(data)
[['Tom', 21], ['Jim', 20], ['Susan', 19]]
獲得所有人的姓名
data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
names = []
for i in data:
names.append(i[0])
print(names)
['Tom', 'Jim', 'Susan']
六、串列的高級應用
1.多維串列排序
將以上data中的資訊按照子串列中的學號資訊升序排序
我們可以使用sort或sorted進行排序,按照要求我們需要根據個人的學號資訊進行排序,它在個人資訊中索引是2,
這里我們將使用key這個引數,如前所述,它的作用是指定排序比較的元素,key引數的值應該是一個獲取比較元素的函式,此函式將在每個元素比較前被呼叫,
data = [['Tom',21,'20202501'],['Jim',20,'20181717'],['Susan',19,'20201908']]
data.sort(key = lambda x:x[2]) # 利用lambda建構式
print(data)
[['Jim', 20, '20181717'], ['Susan', 19, '20201908'], ['Tom', 21, '20202501']]
也可以直接定義一個函式作為key的值
def getindex(index):
return index[2]
data = [['Tom', 21, '20202501'], ['Jim', 20, '20181717'], ['Susan', 19, '20201908']]
data.sort(key=getindex)
print(data)
[['Jim', 20, '20181717'], ['Susan', 19, '20201908'], ['Tom', 21, '20202501']]
再看一個串列中字典的排序,要求根據key為1的值進行排序,[2](在原文基礎上有一定改動)
L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f2(a):
return a[1]
L.sort(key = f2)
print(L)
[{1: 1, 2: 4, 5: 6}, {1: 3, 6: 3}, {1: 5, 3: 4}, {1: 9}]
2.串列推導式
串列推導式(list comprehension)也稱為串列決議式,是一種創建串列的簡潔語法,
假設要生成一個1到100以內所有偶數,我們常規的做法是:
numbers = []
for i in range(1,101):
if i % 2 == 0:
numbers.append(i)
print(numbers)
使用串列推導式我們可以簡化為:
numbers = [x for x in range(1,101) if x % 2 == 0]
print(numbers)
是不是感覺簡化了很多,串列推導式只有一行代碼,
串列推導式的結構:[添加的目標元素 for 變數 in 可迭代的序列 if 篩選的條件]
再看幾個例子:
# 將10以內所有奇數的平方存入串列
numbers = [x**2 for x in range(1,11) if x % 2 != 0]
print(numbers)
[1, 9, 25, 49, 81]
# 將串列中所有起始為‘b’的單詞存入串列
word_startwith_b = [x for x in ['red','blue','green','black','pink'] if x.startswith('b')]
print(word_startwith_b)
['blue', 'black']
# 將串列中所有單詞存入串列
animals = [x for x in ['lion','tiger',1,333,'elephant'] if str(x).isalpha()]
print(animals)
['lion', 'tiger', 'elephant']
3.構造多維串列
原意是創建一個包含3個空的子串列的串列,然后將0存入其中第2個串列下,但是輸出后發現,三個子串列都新增了0,
觀察發現,3個子串列都是同一個id,
numbers = [[]] * 3
numbers
[[], [], []]
numbers[1].append(0)
numbers
[[0], [0], [0]]
for i in range(len(numbers)):
... print(id(numbers[i]))
...
4472764480
4472764480
4472764480
正確的方法如下:
numbers = [[] for i in range(3)]
print(numbers)
for index in range(len(numbers)):
numbers[index].append(index)
print(id(numbers[index]))
print(numbers)
[[], [], []]
4414227648
4414217216
4414678208
[[0], [1], [2]]
七、練習
1.串列基礎練習
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
完成以下任務:
1.在串列的最后插入100
2.將30插入到串列的中間位置
3.將索引為3的元素洗掉
4.將[22,33,44]合并到串列的最后
5.將串列中的元素從大到小、從小到大各排序一次,
2.串列復雜練習
lst = [11, 22, 33, [44, 55, 66, 77, [88, 99, 100, 110]]]
編程完成以下任務:
1.輸出lst的長度
2.輸出lst中元素的和
3.將55修改為5555
4.輸出99
5.將[7788,8899]插入到66的后面
6.找出串列中所有元素的最大值
在完成以上操作后,思考回答以下問題:
1.lst[-1][-1][-2]是什么?
2.len(lst[-1][-1])是多少?
3.lst[-1][1:3]是什么?
4.lst[-1][-1][1:-2]是什么?
3.有一個已經排好序的串列[23, 24, 30, 32, 40, 46, 61, 65, 87, 96],用戶隨機輸入一個數,將它按原有規律插入串列中,
4.products = [["iphone",6888],["MacPro",14800],["小米6",2499],["Coffee",31],["Book",60],["Nike",699]],需列印出以下格式,
------ 商品串列 ------
0 iphone 6888
1 MacPro 14800
2 小米6 2499
3 Coffee 31
4 Book 60
5 Nike 699
5.在上題基礎上,撰寫一個程式,實作不斷詢問用戶想買什么,提示用戶輸入商品編號,就把對應的商品添加到購物車里,同時顯示當前購物車中的商品串列和總價格,最終用戶輸入q退出時,列印購買的商品串列及總價格,
八、第十課練習答案
1.有一分數序列,2/1、3/2、5/3、8/5、13/8、21/13……,求出這個數列的前20項之和,
x = 2
y = 1
summary = 0
for i in range(20):
summary = x/y
x,y = x+y,x
print(x,y)
print('數列的前20項之和為%.4f'%summary)
2.求1+2!+3!+4!+……+20!的值,
summary = 0
for i in range(1,21):
n = 1
for j in range(1,i+1):
n *= j
summary += n
print('1+2!+3!+4!+……+20!的值為%i'%summary)
3.將“hello world”用相反順序列印出來,
words = "hello world"
print(words[::-1])
4.判斷字串中是否有連續三個英文單詞,如:"Hello World hello"的結果為True、"He is 123 man"的結果為False、"1 2 3 4"結果為False、"bla bla bla bla"的結果為True,(提醒:可能需要用到split()、isalpha()、isdigit()等函式)
words = "He is 123 a 23 good man"
sum = 0
for word in words.split():
if word.isalpha():
sum += 1
if sum == 3:
print(True)
break
elif word.isdigit():
sum = 0
else:
print(False)
參考文獻:
[1]Python3串列.https://www.runoob.com/python3/python3-list.html
[2]https://www.zhihu.com/question/36280272
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/231479.html
標籤:其他
上一篇:C語言每日一題(四)
下一篇:cgb2008-京淘day10
