1. 清單
定義: 用[]表示整體,每個元素用,隔開。有序集合,沒有固定大小,能夠儲存任意數量任意剋性的Python對象。
建立:
(1)普通清單
(2)range
(3)推導式
(4)數組
(5)混合
(6)空清單
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
x = list(range(10))
x = list(range(1, 11, 2))
x = [0] * 5
x = [0 for i in range(5)]
x = [i for i in range(10)]
x = [i for i in range(100) if (i % 2 != 0) and (i % 3 == 0)]
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x = [[0] * 3 for row in range(4)]
# x = [a] * 4操作中,隻是建立4個指向list的引用,a一旦改變,x中的4個a也随之改變。
x = [[0] * 3] * 4
x[0][0] = 1
mix = [1, 'lsgo', 3.14, [1, 2, 3]]
empty = []
向清單中添加元素:
(1)list.append(obj):清單末尾添加新的對象,可以是任意類型,被追加的元素在list中保持原結構類型。
(2)list.extend(seq):清單末尾一次性追加另一個序列中的多個值。
(3)list.insert(index, obj):指定位置添加某元素。
删除清單中的元素:
(1)list.remove(obj):移除某個值的第一個比對項。
(2)list.pop([index=-1]):移除某個位置的元素,預設是最後一個元素,并傳回該元素值。
(3)del var1[, var2, …]:删除單個或多個對象。
擷取清單中的元素:
(1)單個元素:
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
print(x[0])
(2)多個元素:切片
x = [123, 456, 789, 213]
x1 = x
x2 = x[:]
x.sort() # x1随之改變,x2不變
x[2] = 546 # x1随之改變,x2不變
list1 = [[123, 456], [789, 213]]
list2 = list1
list3 = list1[:]
list1[0][0] = 111 # list2、list3都随之改變
常用操作符:
==:清單中元素、位置都一緻時才傳回True。
+:首尾拼接;*:複制拼接。需要消耗額外的沒存,盡量不用,多用 append, extend, insert。
其他方法:
list.count(obj):統計某元素出現的次數。
list.reverse():反向清單中的元素。
list.sort(key=None, reverse=False):key – 用來比較的元素,指定可疊代對象中的一個元素進行排序。reverse – True(降序),False(升序,預設)
練習題:
(1)清單操作練習
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst.append(15)
lst.insert(len(lst) // 2, 20)
lst.extend([2, 5, 6])
lst.pop(3)
lst.reverse()
lst.sort()
lst.sort(reverse=True)
(2)修改清單:把清單中所有數字修改為原來的兩倍。
lst = [1, [4, 6], True]
for i in range(len(lst)):
if type(lst[i]) == list:
l = len(lst[i])
for j in range(l):
if type(lst[i][j]) == int:
lst[i][j] *= 2
elif type(lst[i]) == int:
lst[i] *= 2
print(lst)
(3)給定一個山脈數組,求頂峰索引。
class Solution:
def peakIndexInMountainArray(self, A):
if len(A) < 3:
print("False")
else:
max = A[0]
for nums in A:
if nums > max:
max = nums
j = A.index(nums)
# print(max, j)
k = 0
for i in range(len(A) - 1):
if (i < j and A[i] >= A[i + 1]) or (i > j and A[i] <= A[i + 1]):
k += 1
if k == 0:
print('True')
else:
print('False')
if __name__ == '__main__':
result = Solution()
A = [1, 3, 4, 5, 3]
result.peakIndexInMountainArray(A)
2. 元組
**定義:**用()把元素綁在一起,用,隔開不同元素。
建立和通路:
與清單類似,不同的是清單使用方括号,元組使用圓括号,且元組内的元素不能修改,除非是元組中的元素為清單這種可修改的形式。
a = (1, 3, [2, 5])
a[2][1] = 0 #(1, 3, [2, 0])
a[1] = 0 #TypeError: 'tuple' object does not support item assignment.
建立元組可以使用小括号,也可以不使用。建議使用提高可讀性。
元組中隻包含一個元素時,要在元素後加逗号,否則不會認為是元組。
通路時也可以有索引和切片兩種形式。
更新和删除:
用+的形式把不同元組或元組的不同部分連接配接起來。
week = ('Monday', 'Tuesday', 'Thursday', 'Friday')
week = week[:2] + ('Wednesday', ) + week[2:]
print(week)
内置方法:
元組的大小和内容都不能修改,是以隻有count和index兩種方法。
tuple.count(obj):記錄該元素在元組中出現的次數。
tuple.index(obj):找到該元素的索引。
解壓元組
(1)解壓一維元組
(2)解壓二維元組
(3)解壓多元元組
t = (1, 10.31, 'python')
(a, b, c) = t # 一維
t = (1, 10.31, ('ok', 'python'))
(a, b, (c, d)) = t # 二維
t = (1, 2, 3, 4, 5)
a, b, *rest, c = t # 把多個元素丢給了*rest變量
練習題:
(1)元組概念
(1, 2) * 2 #(1, 2, 1, 2)
(1, ) * 2 #(1, 1)
(1) * 2 # 2
(1, 2) (1, ) 是一個完整的元組,* 表示複制。
(1) 括号内無逗号,括号看作運算符,* 表示相乘。
(2)拆包
拆包是把元組裡的元素單拉出來分别賦給不同的變量。不僅元組可以,所有的可疊代對象都可以。
a, b = 1, 2 # 屬于拆包過程
a, b, _, _ = 1, 2, 3, 4
a, b, *_ = 1, 2, 3, 4 # 指派給占位符
3. 字元串
**定義:**引号(單、雙)之間的字元集合。不同字元串之間可用+連接配接。若想在字元串中間加引号,需用轉義字元。
常見的轉義字元:
轉義字元 | 描述 |
---|---|
\\ | 反斜杠 |
\’ | 單引号 |
\" | 雙引号 |
\n | 換行 |
\t | Tab |
\r | 回車 |
print('Let\'s go!')
print("Let's go!")
print('C:\\now')
print("C:\\Program files\\Intel")
print(r"C:\Program files\Intel")
切片與拼接:
和清單與元組類似。
常用内置方法:
内置函數 | 功能 |
---|---|
capitalize() | 首字母大寫 |
lower() | 大寫轉小寫 |
upper() | 小寫轉大寫 |
swapcase() | 大寫轉小寫,小寫轉大寫 |
count(str, beg=0,end=len(string)) | 統計 str 出現的次數 |
endswith(suffix,beg=0,end=len(string)) | 是否以suffix結束 |
startswith(substr,beg=0,end=len(string)) | 是否以substr開始 |
find(str,beg=0,end=len(string)) | 從左邊開始找str,傳回索引值;不包含傳回-1 |
rfing(str,beg=0,end=len(string)) | 從右邊開始找str |
isnumeric() | 判斷字元串中是否全為數字字元 |
ljust(width[, fillchar]) | 從左邊補全字元串至width長度,預設用0補 |
rjust(width[, fillchar]) | 從右邊補全字元串 |
lstrip([chars]) | 删除左邊的空格或指定字元 |
rstrip([chars]) | 删除右邊的空格 或指定字元 |
strip([chars]) | 同時執行lstrip和rstrip |
partition(sub) | 分割成三部分,pre-sub,sub,fol-sub,或’原字元串’,’ ‘,’ ’ |
rpartition(sub) | 從右邊開始分割 |
replace(old,new[,max]) | 用new替換old,max為最大替換次數 |
split(str="",num) | 預設以空格分割字元串,也可以指定字元,num表示僅分割num個字元串 |
splitlines([keepends]) | 按行(’\t’ ‘\n’ ‘\t\n’)分割字元串,keepends=False(預設)不保留’\n’,keepends=True保留’\n’。 |
maketrans(intab,outtab) | 建立字元映射的轉換表 |
translate(table,deletechars="") | 用轉換表轉換字元串中的字元,過濾掉的字元放在deletechars中。 |
字元串格式化:
兩種方法:format 和 格式化操作符。
(1)format
兩種參數:位置參數和關鍵字參數。
str = "{0} love {1}".format('I', 'Lsgogroup') #位置參數
str = "{a} love {b}".format(a='I',b='Lsgogroup') #關鍵字參數
(2)格式化操作符
符号 | 描述 |
---|---|
%c | 格式化字元及其ASCⅡ碼 |
%s | 格式化字元串,用str()的方法處理對象 |
%r | 格式化字元串,用rper()方法處理對象 |
%d | 格式化整數 |
%o | 格式化無符号八進制數 |
%x | 格式化無符号十六進制數 |
%X | 格式化無符号十六進制數(大寫) |
%f | 格式化浮點數,可指定小數精度 |
%e | 用科學計數法的形式格式化浮點數 |
%E | 同上 |
%g | 根據值的大小選擇用%f 或%e |
%G | 同上 |
練習:
-
字元串函數回顧
(1)怎麼批量替換字元串中的元素?replace 函數。
(2)怎麼把字元串按照空格進行劃分?split 函數。
(3)怎麼去除字元串首位的空格?lstrip 函數。
- 實作isdigit 函數:判斷字元串中是否隻包含數字0~9。
def isdigit(string):
""" 判斷字元串隻包含數字
:param string:
:return:
"""
# your code here
#return string.isnumeric()
for i in string:
if not(48 <= ord(i) <= 57):
return False
return True
print(isdigit('231p'))