天天看點

Task04 清單、元組和字元串

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. 字元串函數回顧

    (1)怎麼批量替換字元串中的元素?replace 函數。

    (2)怎麼把字元串按照空格進行劃分?split 函數。

    (3)怎麼去除字元串首位的空格?lstrip 函數。

  2. 實作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'))
           

繼續閱讀