1. 程式人生 > 其它 >8. 字串與列表的內建方法

8. 字串與列表的內建方法

字串的內建方法

  1. 需要掌握的操作

  2. 瞭解的操作

列表的內建方法

  1. 型別轉換

  2. 常見操作

可變與不可變型別

佇列與堆疊

 

一、字串的內建方法

前情回顧:索引取值、切片、統計長度、成員運算、去掉首尾指定字元strip()方法、指定字元切割split()方法

1. 需要掌握的操作

1.移除字串首尾的指定字元
s1 = '*****Messi******'
print(s1.strip('*'))  # Messi  左右都移除
print(s1.lstrip('*'))  # Messi******  移除左邊
print(s1.rstrip('*'))  # *****Messi  移除右邊
2.大小寫相關操作
s2 = 'Leo111Messi'
print(s2.lower()) # leo1111messi 將所有的英文字母變成小寫
print(s2.upper()) # LEO111MESSI 將所有的英文字母變成大寫

print(s2.islower()) # False 判斷字串中所有的英文字母是否純小寫,,結果是布林值
print(s2.isupper()) # False 判斷字串中所有的英文字母是否純大寫,,結果是布林值

大小寫操作的應用案例:
圖片驗證碼(由數字、大寫字母、小寫字母組成),輸入驗證碼時,可以忽略大小寫
verify = 'MeSsI10'
print('這是給使用者展示的驗證碼:%s' % verify)

user_verify = input('請輸入驗證碼:')
if verify.lower() == user_verify.lower():
print('輸入正確')
else:
print('輸入錯誤')
3.判斷字串的開頭或者結尾是否是指定的字元
s3 = 'Messi Ronaldo Neymar 666'
print(s3.startswith('M'))  # True 結果是布林值
print(s3.startswith('Messi'))  # True
print(s3.startswith('Ronaldo'))  # False

print(s3.endswith('
6')) # True print(s3.endswith('666')) # True
4.格式化輸出
方式一:佔位符  %s  %d
message = '%s您好,您%s月話費%s元,餘額%s元'
print(message % ('里奧', 2, 88, 12))

方式二:format方法(分為4種)
玩法1:跟佔位符一致,使用{ }佔位
print('His name is {} his age is {}'.format('梅西', 35))
玩法2:根據索引取值,可以反覆使用
print('His name is {0} {0} {0}, his age is {1}'.format('梅西!', 35))
玩法3:根據名字的對應關係取值(可以不按順序)
print('His name is {name} {name}, age is {age}, goals is {goals}'.format(age=35, goals=91, name='梅西!'))
玩法4:直接使用已經出現過的變數(使用頻率比較高)
name = '梅西'
age = 35
print('His name is {name}, his age is {age}')  # 不使用f  列印:print('His name is {name}, his age is {age}')
print(f'His name is {name}, his age is {age}')  # f-string,稱為格式化字串常量  列印:His name is 梅西, his age is 35
5.拼接字串
s4 = '阿根廷足球巨星 里奧梅西 '
s5 = '葡萄牙足球巨星 C羅'
print(s4 + s5)  # 如果字串很大,加號效率較低
print(s4 * 3)  # 重複次數

join方法相當於將括號內的元素進行for迴圈
print('@'.join(s4))  # 阿@根@廷@足@球@巨@星@ @裡@奧@梅@西@
將列表拼接成字串
print('&'.join(['梅西', 'C羅', '林加德', '內馬爾']))  # 梅西&C羅&林加德&內馬爾

join括號內的元素必須是字串,否則報錯
l2 = [10, 30, '梅西']
'~'.join(l2)  # 報錯
6.替換字串中指定的字元
s6 = 'Messi is goat goat goat Messi Messi Messi'
將Messi替換成NeyMar
print(s6.replace('Messi', 'NeyMar'))  # 預設一次性替換所有
print(s6.replace('Messi', 'NeyMar', 2))
# NeyMar is goat goat goat NeyMar Messi Messi  指定替換的個數
7.判斷字串中是否是純數字
s7 = 'Ronaldo7'
print(s7.isdigit())  # False
print('111222'.isdigit())  # True
print('33.44'.isdigit())  # False

isdigit應用:
num = input('請輸入分數:')
if num.isdigit():
    num = int(num)
    print(f'您輸入的分數是:{num}')
else:
    print('請好好寫')

 

2. 瞭解的操作

1.查詢指定字串對應的索引值
s1 = 'messi ronaldo neymar'
print(s1.find('e'))  # 1   從左往右找,找到第一個就結束
print(s1.find('x', 0, 19))  # -1  意思是沒有,找不到

print(s1.index('r', 0, 19))  # 6
print(s1.index('x', 0, 19))  # index方法找不到直接報錯,不推薦使用
2.文字位置改變
s2 = 'LeoMessi'
print(s2.center(30, '-'))  # 總寬度為30,字串居中顯示,不夠用-填充
-----------LeoMessi-----------
print(s2.ljust(20, '@'))  # 總寬度為20,字串左對齊,不夠用@填充
LeoMessi@@@@@@@@@@@@
print(s2.rjust(40, '&'))  # 總寬度為40,字串右對齊,不夠用&填充
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&LeoMessi

print(s2.zfill(15))  # 總寬度為15,字串右對齊,不夠用0填充
0000000LeoMessi
3.特殊符號:斜槓與一些英文字母的組合會產生特殊的含義
print('leo\tMESSI\nNEYMAR\aRONALDO')
"""
leo    MESSI
NEYMARRONALDO
\t 水平製表符,用於橫向跳到下一製表位
\n 換行符
\a 響鈴(BEL)
"""

如果想取消特殊含義,可以在字串前面加r(raw string 不進行轉義)
print(r'leo\tMESSI\nNEYMAR\aRONALDO')
leo\tMESSI\nNEYMAR\aRONALDO
4.capitalize、swapcase、title
# capitalize:首字母大寫
s4 = 'hi,lionel messi'
print(s4.capitalize())  # Hi,lionel messi

# swapcase:大小寫反轉
s5 = 'HELLO,ronaldo'
print(s5.swapcase())  # hello,RONALDO

# title:每個單詞的首字母大寫
s6 = 'good morning, cristiano ronaldo'
print(s6.title())  # Good Morning, Cristiano Ronaldo

 

二、列表的內建方法

1. 型別轉換

list可以轉換支援被for迴圈的資料型別(可迭代的物件)
可迭代物件:字串、列表、元組、字典、集合
不可迭代物件:整型、浮點型、布林值
print(list(11))  # 整型,不可以print(list(22.33))  # 浮點型,不可以print(list(True))  # 布林值,不可以
print(list('messi'))  # ['m', 'e', 's', 's', 'i']

print(list((11, 22, 33, 44)))  # [11, 22, 33, 44]

print(list({'name': '梅西', 'age': 35}))  # ['name', 'age']

print(list({5, 6, 7, 8, 9}))  # [5, 6, 7, 8, 9]

2. 常見操作

player = ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼']
# 1.索引取值
print(player[0])  # 梅西
print(player[-1])  # 卡瓦尼
# 2.切片操作(類比字串的切片和range函式)
print(player[1:4])  # ['C羅', '貝爾', '萊萬']
print(player[1:4:2])  # 第三個引數2用於控制步長['C羅', '萊萬']

print(player[-4:-1])  # 索引值為負數 ['C羅', '貝爾', '萊萬']
print(player[-1:-4:-1])  # 第三個引數-1用於控制反方向取  ['卡瓦尼', '萊萬', '貝爾']
# 3.統計列表中元素的個數
print(len(player))  # 5
# 4.成員運算(最小判斷單位是元素不是元素裡面的單個字元)
print('西' in player)  # False
print('梅西' in player)  # True
player = ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼']
5.列表中新增元素的方式

5.1尾部追加單個元素
print(player.append('大英帝國球王林加德'))  # 列印的值為None
print(player)  # ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼', '大英帝國球王林加德']
player.append([111, 222, 333])
print(player)  # ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼', '大英帝國球王林加德', [111, 222, 333]]

5.2指定位置插入單個元素
print(player.insert(0, 111))  # 列印的值為None;;player.insert(0, 123)的執行不會返回值
print(player)  # [111, '梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼']

player.insert(1, '---球王---')
print(player)  # ['梅西', '---球王---', 'C羅', '貝爾', '萊萬', '卡瓦尼']

player.insert(2, [11, 22, 33])
print(player)  # ['梅西', 'C羅', [11, 22, 33], '貝爾', '萊萬', '卡瓦尼']

5.3合併列表
extend可以看作是for迴圈+append
player.extend([333, 444, 555])
print(player)  # ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼', 333, 444, 555]
上述程式碼的for迴圈實現方式:
for i in [333, 444, 555]:
    player.append(i)
print(player)
還可以用增量賦值實現 player += [333, 444, 555],類比於使用加號拼接字串,加號的效率不高
player = ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼']
6.刪除元素
6.1通用的刪除方式
del player[0]  # 通過索引刪除
print(player)  # ['C羅', '貝爾', '萊萬', '卡瓦尼']

6.2就地刪除(使用元素名稱刪除)  沒有返回值
print(player.remove('卡瓦尼'))  # None
print(player)  # ['梅西', 'C羅', '貝爾', '萊萬']

6.3延遲刪除
pop(),預設刪除列表最後一個元素,並將刪除的值返回,括號內可以通過加索引值來刪除指定元素
print(player.pop())  # 卡瓦尼   不寫入索引值刪除末尾
print(player)  # ['梅西', 'C羅', '貝爾', '萊萬']

print(player.pop(2))  # 貝爾
print(player)  # ['梅西', 'C羅', '萊萬', '卡瓦尼']

player = ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼']
# 7.修改列表元素
print(id(player[0]))  # 2281066470720

player[0] = 'AAA'
print(id(player[0]))  # 2281067094960
print(player)  # ['AAA', 'C羅', '貝爾', '萊萬', '卡瓦尼']

# 8.排序
s8 = [33, 55, 44, 11, 66, 77, 22, 99, 88]
# s8.sort()  # 預設是升序
# print(s8)  # [11, 22, 33, 44, 55, 66, 77, 88, 99]

s8.sort(reverse=True)  # 可以修改為降序
print(s8)  # [99, 88, 77, 66, 55, 44, 33, 22, 11]
player = ['梅西', 'C羅', '貝爾', '萊萬', '卡瓦尼']
# 9.翻轉
player.reverse()
print(player)  # ['卡瓦尼', '萊萬', '貝爾', 'C羅', '梅西']
# 10.比較運算
# 列表在作比較的時候,比的是對應索引位置上的元素
s10 = [11, 22, 33]
s11 = [1, 2, 3, 4, 5, 6]
print(s11 > s10)  # False

# 字串的大小是按照ASCII碼錶的先後順序加以區別,表中排在後面的字元大於前面的
# A在ASCII碼錶中的值為65,a為97
s12 = ['A', 'B', 'C']
s13 = ['a']
print(s13 > s12)  # True
# 11.統計列表中某個元素出現的次數
s14 = [111, 222, 222, 333, 333, 333, 444, 444, 444, 444]
print(s14.count(333))  # 3
# 12.清空列表
s15 = [1, 2, 3]
s15.clear()
print(s15)  # []

三、可變與不可變型別

可變型別

舉例:列表

值改變,列表記憶體地址不變

 

 

 

不可變型別

舉例:字串

值改變,記憶體地址一定發生變化

 

 

# 1.字串是不可變型別
s1 = '@@@Messi@@@'
print(s1.strip('@'))  # Messi  strip方法產生了新的值,s1值的本身沒有修改
print(s1)  # @@@Messi@@@
# 2.列表是可變型別
l2 = [1, 2, 3]
print(id(l2))  # 2640212011592

print(l2.extend(['aaa', 'bbb']))  # 列印None
print(l2)  # [1, 2, 3, 'aaa', 'bbb']
print(id(l2))  # 2640212011592 列表增加元素後,列表的記憶體地址沒有發生變化

四、 佇列與堆疊

佇列

       先進先出    類似於從桶的底下放水

堆疊

      先進後出     類似於從桶的表面打水



使用列表模擬佇列與堆疊
# 1.佇列
l3 = []
# 先進
l3.append(111)
l3.append(222)
l3.append(333)
# 先出
print(l3.pop(0))  # 每次將0號索引的值刪除,並且將刪除的值返回
print(l3.pop(0))
print(l3.pop(0))
# 2.堆疊
l4 = []
# 先進
l4.append(444)
l4.append(555)
l4.append(666)
# 後出
print(l4.pop())  # pop方法預設刪除列表的最後一個元素,每次將最後一個元素刪除,並且將刪除的值返回
print(l4.pop())
print(l4.pop())