1. 程式人生 > 實用技巧 >第4章 資料序列

第4章 資料序列

1 字串

1.1 認識字串

字串是 Python 中最常用的資料型別。我們一般使用引號來建立字串。建立字串很簡單,只要為變數分配一個值即可。

a = 'hello world'
b = "abcdefg"
print(type(a))
print(type(b))

注意:控制檯顯示結果為<class 'str'>, 即資料型別為str(字串)。

1.1.1 字串特徵

  • 一對引號字串

name1 = 'Tom'
name2 = "Rose"
  • 三引號字串

name3 = ''' Tom '''
name4 = """ Rose """
a = ''' i am Tom, 
        nice to meet you! 
''' b = """ i am Rose, nice to meet you! """

注意:三引號形式的字串支援換行。

思考:如果建立一個字串I'm Tom?

c = "I'm Tom"
d = 'I\'m Tom'

1.1.2 字串輸出

print('hello world')

name = 'Tom'
print('我的名字是%s' % name)
print(f'我的名字是{name}')

1.1.3 字串輸入

在Python中,使用input()接收使用者輸入。

  • 程式碼

name = input('請輸入您的名字:')
print(f'
您輸入的名字是{name}') print(type(name)) password = input('請輸入您的密碼:') print(f'您輸入的密碼是{password}') print(type(password))
  • 輸出結果

1.2 下標

“下標”又叫“索引”,就是編號。比如火車座位號,座位號的作用:按照編號快速找到對應的座位。同理,下標的作用即是通過下標快速找到對應的資料。

1.2.1 快速體驗

需求:字串name = "abcdef",取到不同下標對應的資料。

  • 程式碼

name = "abcdef"

print(name[1])
print(name[0])
print(name[2])
  • 輸出結果

注意:下標從0開始。

1.3 切片

切片是指對操作的物件擷取其中一部分的操作。字串、列表、元組都支援切片操作。

1.3.1 語法

序列[開始位置下標:結束位置下標:步長]

注意

  1. 不包含結束位置下標對應的資料, 正負整數均可;

  2. 步長是選取間隔,正負整數均可,預設步長為1。

1.3.2 體驗

name = "abcdefg"

print(name[2:5:1])  # cde
print(name[2:5])  # cde
print(name[:5])  # abcde
print(name[1:])  # bcdefg
print(name[:])  # abcdefg
print(name[::2])  # aceg
print(name[:-1])  # abcdef, 負1表示倒數第一個資料
print(name[-4:-1])  # def
print(name[::-1])  # gfedcba

1.4 常用操作方法

字串的常用操作方法有查詢、修改和判斷三大類。

1.4.1 查詢

所謂字串查詢方法即是查詢子串在字串中的位置或出現的次數。

  • find():檢測某個子串是否包含在這個字串中,如果在返回這個子串開始的位置下標,否則則返回-1。

  1. 語法

字串序列.find(子串, 開始位置下標, 結束位置下標)

注意:開始和結束位置下標可以省略,表示在整個字串序列中查詢。

  1. 快速體驗

mystr = "hello world and itcast and itheima and Python"

print(mystr.find('and'))  # 12
print(mystr.find('and', 15, 30))  # 23
print(mystr.find('ands'))  # -1
  • index():檢測某個子串是否包含在這個字串中,如果在返回這個子串開始的位置下標,否則則報異常。

  1. 語法

字串序列.index(子串, 開始位置下標, 結束位置下標)

注意:開始和結束位置下標可以省略,表示在整個字串序列中查詢。

  1. 快速體驗

mystr = "hello world and itcast and itheima and Python"

print(mystr.index('and'))  # 12
print(mystr.index('and', 15, 30))  # 23
print(mystr.index('ands'))  # 報錯
  • rfind(): 和find()功能相同,但查詢方向為右側開始。

  • rindex():和index()功能相同,但查詢方向為右側開始。

  • count():返回某個子串在字串中出現的次數

  1. 語法

字串序列.count(子串, 開始位置下標, 結束位置下標)

注意:開始和結束位置下標可以省略,表示在整個字串序列中查詢。

  1. 快速體驗

mystr = "hello world and itcast and itheima and Python"

print(mystr.count('and'))  # 3
print(mystr.count('ands'))  # 0
print(mystr.count('and', 0, 20))  # 1

1.4.2 修改

所謂修改字串,指的就是通過函式的形式修改字串中的資料。

  • replace():替換

  1. 語法

字串序列.replace(舊子串, 新子串, 替換次數)

注意:替換次數如果查出子串出現次數,則替換次數為該子串出現次數。

  1. 快速體驗

mystr = "hello world and itcast and itheima and Python"

# 結果:hello world he itcast he itheima he Python
print(mystr.replace('and', 'he'))
# 結果:hello world he itcast he itheima he Python
print(mystr.replace('and', 'he', 10))
# 結果:hello world and itcast and itheima and Python
print(mystr)

注意:資料按照是否能直接修改分為可變型別不可變型別兩種。字串型別的資料修改的時候不能改變原有字串,屬於不能直接修改資料的型別即是不可變型別。

  • split():按照指定字元分割字串。

  1. 語法

字串序列.split(分割字元, num)

注意:num表示的是分割字元出現的次數,即將來返回資料個數為num+1個。

  1. 快速體驗

mystr = "hello world and itcast and itheima and Python"

# 結果:['hello world ', ' itcast ', ' itheima ', ' Python']
print(mystr.split('and'))
# 結果:['hello world ', ' itcast ', ' itheima and Python']
print(mystr.split('and', 2))
# 結果:['hello', 'world', 'and', 'itcast', 'and', 'itheima', 'and', 'Python']
print(mystr.split(' '))
# 結果:['hello', 'world', 'and itcast and itheima and Python']
print(mystr.split(' ', 2))

注意:如果分割字元是原有字串中的子串,分割後則丟失該子串。

  • join():用一個字元或子串合併字串,即是將多個字串合併為一個新的字串。

  1. 語法

字元或子串.join(多字串組成的序列)
  1. 快速體驗

list1 = ['chuan', 'zhi', 'bo', 'ke']
t1 = ('aa', 'b', 'cc', 'ddd')
# 結果:chuan_zhi_bo_ke
print('_'.join(list1))
# 結果:aa...b...cc...ddd
print('...'.join(t1))
  • capitalize():將字串第一個字元轉換成大寫。

mystr = "hello world and itcast and itheima and Python"

# 結果:Hello world and itcast and itheima and python
print(mystr.capitalize())

注意:capitalize()函式轉換後,隻字符串第一個字元大寫,其他的字元全都小寫。

  • title():將字串每個單詞首字母轉換成大寫。

mystr = "hello world and itcast and itheima and Python"

# 結果:Hello World And Itcast And Itheima And Python
print(mystr.title())
  • lower():將字串中大寫轉小寫。

mystr = "hello world and itcast and itheima and Python"

# 結果:hello world and itcast and itheima and python
print(mystr.lower())
  • upper():將字串中小寫轉大寫。

mystr = "hello world and itcast and itheima and Python"

# 結果:HELLO WORLD AND ITCAST AND ITHEIMA AND PYTHON
print(mystr.upper())
  • lstrip():刪除字串左側空白字元。

  • rstrip():刪除字串右側空白字元。

  • strip():刪除字串兩側空白字元。

  • ljust():返回一個原字串左對齊,並使用指定字元(預設空格)填充至對應長度 的新字串。

  1. 語法

字串序列.ljust(長度, 填充字元)
  1. 輸出效果

  • rjust():返回一個原字串右對齊,並使用指定字元(預設空格)填充至對應長度 的新字串,語法和ljust()相同。

  • center():返回一個原字串居中對齊,並使用指定字元(預設空格)填充至對應長度 的新字串,語法和ljust()相同。

1.4.3 判斷

所謂判斷即是判斷真假,返回的結果是布林型資料型別:True 或 False。

  • startswith():檢查字串是否是以指定子串開頭,是則返回 True,否則返回 False。如果設定開始和結束位置下標,則在指定範圍內檢查。

  1. 語法

字串序列.startswith(子串, 開始位置下標, 結束位置下標)
  1. 快速體驗

mystr = "hello world and itcast and itheima and Python   "

# 結果:True
print(mystr.startswith('hello'))

# 結果False
print(mystr.startswith('hello', 5, 20))
  • endswith()::檢查字串是否是以指定子串結尾,是則返回 True,否則返回 False。如果設定開始和結束位置下標,則在指定範圍內檢查。

  1. 語法

字串序列.endswith(子串, 開始位置下標, 結束位置下標)
  1. 快速體驗

mystr = "hello world and itcast and itheima and Python"

# 結果:True
print(mystr.endswith('Python'))

# 結果:False
print(mystr.endswith('python'))

# 結果:False
print(mystr.endswith('Python', 2, 20))
  • isalpha():如果字串至少有一個字元並且所有字元都是字母則返回 True, 否則返回 False。

mystr1 = 'hello'
mystr2 = 'hello12345'

# 結果:True
print(mystr1.isalpha())

# 結果:False
print(mystr2.isalpha())
  • isdigit():如果字串只包含數字則返回 True 否則返回 False。

mystr1 = 'aaa12345'
mystr2 = '12345'

# 結果: False
print(mystr1.isdigit())

# 結果:False
print(mystr2.isdigit())
  • isalnum():如果字串至少有一個字元並且所有字元都是字母或數字則返 回 True,否則返回 False。

mystr1 = 'aaa12345'
mystr2 = '12345-'

# 結果:True
print(mystr1.isalnum())

# 結果:False
print(mystr2.isalnum())
  • isspace():如果字串中只包含空白,則返回 True,否則返回 False。

mystr1 = '1 2 3 4 5'
mystr2 = '     '

# 結果:False
print(mystr1.isspace())

# 結果:True
print(mystr2.isspace())

1.5 總結

  • 下標

    • 計算機為資料序列中每個元素分配的從0開始的編號

  • 切片

序列名[開始位置下標:結束位置下標:步長]
  • 常用操作方法

    • find()

    • index()

2 列表

2.1 列表的應用場景

思考:有一個人的姓名(TOM)怎麼書寫儲存程式?

答:變數。

思考:如果一個班級100位學生,每個人的姓名都要儲存,應該如何書寫程式?宣告100個變數嗎?

答:列表即可, 列表一次性可以儲存多個數據。

2.2 列表的格式

[資料1, 資料2, 資料3, 資料4......]

列表可以一次性儲存多個數據,且可以為不同資料型別。

2.3 列表的常用操作

列表的作用是一次性儲存多個數據,程式設計師可以對這些資料進行的操作有:增、刪、改、查。

2.3.1 查詢

1. 下標

name_list = ['Tom', 'Lily', 'Rose']

print(name_list[0])  # Tom
print(name_list[1])  # Lily
print(name_list[2])  # Rose

2. 函式

  • index():返回指定資料所在位置的下標 。

  1. 語法

列表序列.index(資料, 開始位置下標, 結束位置下標)
  1. 快速體驗

name_list = ['Tom', 'Lily', 'Rose']

print(name_list.index('Lily', 0, 2))  # 1

注意:如果查詢的資料不存在則報錯。

  • count():統計指定資料在當前列表中出現的次數。

name_list = ['Tom', 'Lily', 'Rose']

print(name_list.count('Lily'))  # 1
  • len():訪問列表長度,即列表中資料的個數。

name_list = ['Tom', 'Lily', 'Rose']

print(len(name_list))  # 3

3. 判斷是否存在

  • in:判斷指定資料在某個列表序列,如果在返回True,否則返回False

name_list = ['Tom', 'Lily', 'Rose']

# 結果:True
print('Lily' in name_list)

# 結果:False
print('Lilys' in name_list)
  • not in:判斷指定資料不在某個列表序列,如果不在返回True,否則返回False

name_list = ['Tom', 'Lily', 'Rose']

# 結果:False
print('Lily' not in name_list)

# 結果:True
print('Lilys' not in name_list)
  • 體驗案例

需求:查詢使用者輸入的名字是否已經存在。

name_list = ['Tom', 'Lily', 'Rose']

name = input('請輸入您要搜尋的名字:')

if name in name_list:
    print(f'您輸入的名字是{name}, 名字已經存在')
else:
    print(f'您輸入的名字是{name}, 名字不存在')

2.3.2 增加

作用:增加指定資料到列表中。

  • append():列表結尾追加資料。

  1. 語法

列表序列.append(資料)
  1. 體驗

name_list = ['Tom', 'Lily', 'Rose']

name_list.append('xiaoming')

# 結果:['Tom', 'Lily', 'Rose', 'xiaoming']
print(name_list)

列表追加資料的時候,直接在原列表裡面追加了指定資料,即修改了原列表,故列表為可變型別資料。

  1. 注意點

如果append()追加的資料是一個序列,則追加整個序列到列表

name_list = ['Tom', 'Lily', 'Rose']

name_list.append(['xiaoming', 'xiaohong'])

# 結果:['Tom', 'Lily', 'Rose', ['xiaoming', 'xiaohong']]
print(name_list)
  • extend():列表結尾追加資料,如果資料是一個序列,則將這個序列的資料逐一新增到列表。

  1. 語法

列表序列.extend(資料)
  1. 快速體驗

    2.1 單個數據

name_list = ['Tom', 'Lily', 'Rose']

name_list.extend('xiaoming')

# 結果:['Tom', 'Lily', 'Rose', 'x', 'i', 'a', 'o', 'm', 'i', 'n', 'g']
print(name_list)

2.2 序列資料

name_list = ['Tom', 'Lily', 'Rose']

name_list.extend(['xiaoming', 'xiaohong'])

# 結果:['Tom', 'Lily', 'Rose', 'xiaoming', 'xiaohong']
print(name_list)
  • insert():指定位置新增資料。

  1. 語法

列表序列.insert(位置下標, 資料)
  1. 快速體驗

name_list = ['Tom', 'Lily', 'Rose']

name_list.insert(1, 'xiaoming')

# 結果:['Tom', 'xiaoming', 'Lily', 'Rose']
print(name_list)

2.3.3 刪除

  • del

  1. 語法

del 目標
  1. 快速體驗

    2.1 刪除列表

name_list = ['Tom', 'Lily', 'Rose']

# 結果:報錯提示:name 'name_list' is not defined
del name_list
print(name_list)

2.2 刪除指定資料

name_list = ['Tom', 'Lily', 'Rose']

del name_list[0]

# 結果:['Lily', 'Rose']
print(name_list)
  • pop():刪除指定下標的資料(預設為最後一個),並返回該資料。

  1. 語法

列表序列.pop(下標)
  1. 快速體驗

name_list = ['Tom', 'Lily', 'Rose']

del_name = name_list.pop(1)

# 結果:Lily
print(del_name)

# 結果:['Tom', 'Rose']
print(name_list)
  • remove():移除列表中某個資料的第一個匹配項。

  1. 語法

列表序列.remove(資料)
  1. 快速體驗

name_list = ['Tom', 'Lily', 'Rose']

name_list.remove('Rose')

# 結果:['Tom', 'Lily']
print(name_list)
  • clear():清空列表

name_list = ['Tom', 'Lily', 'Rose']​

name_list.clear()
print(name_list) # 結果: []

2.3.4 修改

  • 修改指定下標資料

name_list = ['Tom', 'Lily', 'Rose']

name_list[0] = 'aaa'

# 結果:['aaa', 'Lily', 'Rose']
print(name_list)
  • 逆置:reverse()

num_list = [1, 5, 2, 3, 6, 8]

num_list.reverse()

# 結果:[8, 6, 3, 2, 5, 1]
print(num_list)
  • 排序:sort()

  1. 語法

列表序列.sort( key=None, reverse=False)

注意:reverse表示排序規則,reverse = True 降序, reverse = False 升序(預設)

  1. 快速體驗

num_list = [1, 5, 2, 3, 6, 8]

num_list.sort()

# 結果:[1, 2, 3, 5, 6, 8]
print(num_list)

2.3.5 複製

函式:copy()

name_list = ['Tom', 'Lily', 'Rose']

name_li2 = name_list.copy()

# 結果:['Tom', 'Lily', 'Rose']
print(name_li2)

2.4 列表的迴圈遍歷

需求:依次列印列表中的各個資料。

2.4.1 while

  • 程式碼

name_list = ['Tom', 'Lily', 'Rose']

i = 0
while i < len(name_list):
    print(name_list[i])
    i += 1
  • 執行結果

2.4.2 for

  • 程式碼

name_list = ['Tom', 'Lily', 'Rose']

for i in name_list:
    print(i)
  • 執行結果

2.5 列表巢狀

所謂列表巢狀指的就是一個列表裡面包含了其他的子列表。

應用場景:要儲存班級一、二、三三個班級學生姓名,且每個班級的學生姓名在一個列表。

name_list = [['小明', '小紅', '小綠'], ['Tom', 'Lily', 'Rose'], ['張三', '李四', '王五']]

思考: 如何查詢到資料"李四"?

# 第一步:按下標查詢到李四所在的列表
print(name_list[2])

# 第二步:從李四所在的列表裡面,再按下標找到資料李四
print(name_list[2][1])

2.6 綜合應用 -- 隨機分配辦公室

需求:有三個辦公室,8位老師,8位老師隨機分配到3個辦公室

2.7 總結

  • 列表的格式

[資料1, 資料2, 資料3]
  • 常用操作方法

    • index()

    • len()

    • append()

    • pop()

    • remove()

  • 列表巢狀

name_list = [['小明', '小紅', '小綠'], ['Tom', 'Lily', 'Rose'], ['張三', '李四', '王五']]
name_list[2][1]

3 元組

3.1 元組的應用場景

思考:如果想要儲存多個數據,但是這些資料是不能修改的資料,怎麼做?

答:列表?列表可以一次性儲存多個數據,但是列表中的資料允許更改。

num_list = [10, 20, 30]
num_list[0] = 100

一個元組可以儲存多個數據,元組內的資料是不能修改的。

3.2 定義元組

元組特點:定義元組使用小括號,且逗號隔開各個資料,資料可以是不同的資料型別。

# 多個數據元組
t1 = (10, 20, 30)

# 單個數據元組
t2 = (10,)

注意:如果定義的元組只有一個數據,那麼這個資料後面也好新增逗號,否則資料型別為唯一的這個資料的資料型別

t2 = (10,)
print(type(t2))  # tuple

t3 = (20)
print(type(t3))  # int

t4 = ('hello')
print(type(t4))  # str

3.3 元組的常見操作

元組資料不支援修改,只支援查詢,具體如下:

  • 按下標查詢資料

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1[0])  # aa
  • index():查詢某個資料,如果資料存在返回對應的下標,否則報錯,語法和列表、字串的index方法相同。

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1.index('aa'))  # 0
  • count():統計某個資料在當前元組出現的次數。

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1.count('bb'))  # 2
  • len():統計元組中資料的個數。

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(len(tuple1))  # 4

注意:元組內的直接資料如果修改則立即報錯

tuple1 = ('aa', 'bb', 'cc', 'bb')
tuple1[0] = 'aaa'

但是如果元組裡面有列表,修改列表裡面的資料則是支援的,故自覺很重要。

tuple2 = (10, 20, ['aa', 'bb', 'cc'], 50, 30)
print(tuple2[2])  # 訪問到列表

# 結果:(10, 20, ['aaaaa', 'bb', 'cc'], 50, 30)
tuple2[2][0] = 'aaaaa'
print(tuple2)

3.4 總結

  • 定義元組

t1 = (10, 20, 30)

t2 = (10,)
  • 常用操作方法

    • index()

    • len()

4 字典

4.1 字典的應用場景

思考1: 如果有多個數據,例如:'Tom', '男', 20,如何快速儲存?

答:列表

list1 = ['Tom', '', 20]

思考2:如何查詢到資料'Tom'?

答:查詢到下標為0的資料即可。

list1[0]

思考3:如果將來資料順序發生變化,如下所示,還能用list1[0]訪問到資料'Tom'嗎?。

list1 = ['', 20, 'Tom']

答:不能,資料'Tom'此時下標為2。

思考4:資料順序發生變化,每個資料的下標也會隨之變化,如何保證資料順序變化前後能使用同一的標準查詢資料呢?

答:字典,字典裡面的資料是以鍵值對形式出現,字典資料和資料順序沒有關係,即字典不支援下標,後期無論資料如何變化,只需要按照對應的鍵的名字查詢資料即可。

4.2 建立字典的語法

字典特點:

  • 符號為大括號

  • 資料為鍵值對形式出現

  • 各個鍵值對之間用逗號隔開

# 有資料字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}

# 空字典
dict2 = {}

dict3 = dict()

注意:一般稱冒號前面的為鍵(key),簡稱k;冒號後面的為值(value),簡稱v。

4.3 字典常見操作

4.3.1 增

寫法:字典序列[key] = 值

注意:如果key存在則修改這個key對應的值;如果key不存在則新增此鍵值對。

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}

dict1['name'] = 'Rose'
# 結果:{'name': 'Rose', 'age': 20, 'gender': '男'}
print(dict1)

dict1['id'] = 110

# {'name': 'Rose', 'age': 20, 'gender': '男', 'id': 110}
print(dict1)

注意:字典為可變型別。

4.3.2 刪

  • del() / del:刪除字典或刪除字典中指定鍵值對。

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}

del dict1['gender']
# 結果:{'name': 'Tom', 'age': 20}
print(dict1)
  • clear():清空字典

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}

dict1.clear()
print(dict1)  # {}

4.3.3 改

寫法:字典序列[key] = 值

注意:如果key存在則修改這個key對應的值;如果key不存在則新增此鍵值對。

4.3.4 查

1. key值查詢

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
print(dict1['name'])  # Tom
print(dict1['id'])  # 報錯

如果當前查詢的key存在,則返回對應的值;否則則報錯。

2. get()

  • 語法

字典序列.get(key, 預設值)

注意:如果當前查詢的key不存在則返回第二個引數(預設值),如果省略第二個引數,則返回None。

  • 快速體驗

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
print(dict1.get('name'))  # Tom
print(dict1.get('id', 110))  # 110
print(dict1.get('id'))  # None

3. keys()

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
print(dict1.keys())  # dict_keys(['name', 'age', 'gender'])

4. values()

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
print(dict1.values())  # dict_values(['Tom', 20, '男'])

3.4.5 items()

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
print(dict1.items())  # dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])

4.4 字典的迴圈遍歷

4.4.1 遍歷字典的key

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
for key in dict1.keys():
    print(key)

4.4.2 遍歷字典的value

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
for value in dict1.values():
    print(value)

4.4.3 遍歷字典的元素

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
for item in dict1.items():
    print(item)

4.4.4 遍歷字典的鍵值對

dict1 = {'name': 'Tom', 'age': 20, 'gender': ''}
for key, value in dict1.items():
    print(f'{key} = {value}')

4.5 總結

  • 定義字典

dict1 = {'name': 'Python', 'age': 30}

dict2 = {}

dict3 = dict()
  • 常見操作

    • 增/改

字典序列[key] = 值
  • 查詢

    • 字典序列[key]

    • keys()

    • values()

    • items()

5 集合

5.1 建立集合

建立集合使用{}set(), 但是如果要建立空集合只能使用set(),因為{}用來建立空字典。

s1 = {10, 20, 30, 40, 50}
print(s1)

s2 = {10, 30, 20, 10, 30, 40, 30, 50}
print(s2)

s3 = set('abcdefg')
print(s3)

s4 = set()
print(type(s4))  # set

s5 = {}
print(type(s5))  # dict

特點:

  1. 集合可以去掉重複資料;

  2. 集合資料是無序的,故不支援下標

5.2 集合常見操作方法

5.2.1 增加資料

  • add()

s1 = {10, 20}
s1.add(100)
s1.add(10)
print(s1)  # {100, 10, 20}

因為集合有去重功能,所以,當向集合內追加的資料是當前集合已有資料的話,則不進行任何操作。

  • update(), 追加的資料是序列。

s1 = {10, 20}
# s1.update(100)  # 報錯
s1.update([100, 200])
s1.update('abc')
print(s1)

5.2.2 刪除資料

  • remove(),刪除集合中的指定資料,如果資料不存在則報錯。

s1 = {10, 20}

s1.remove(10)
print(s1)

s1.remove(10)  # 報錯
print(s1)
  • discard(),刪除集合中的指定資料,如果資料不存在也不會報錯。

s1 = {10, 20}

s1.discard(10)
print(s1)

s1.discard(10)
print(s1)
  • pop(),隨機刪除集合中的某個資料,並返回這個資料。

s1 = {10, 20, 30, 40, 50}

del_num = s1.pop()
print(del_num)
print(s1)

5.2.3 查詢資料

  • in:判斷資料在集合序列

  • not in:判斷資料不在集合序列

s1 = {10, 20, 30, 40, 50}

print(10 in s1)
print(10 not in s1)

5.3 總結

  • 建立集合

    • 有資料集合

    s1 = {資料1, 資料2, ...}
    • 無資料集合

    s1 = set()
  • 常見操作

    • 增加資料

      • add()

      • update()

    • 刪除資料

      • remove()

      • discard()

6 公共操作

6.1 運算子

運算子描述支援的容器型別
+ 合併 字串、列表、元組
* 複製 字串、列表、元組
in 元素是否存在 字串、列表、元組、字典
not in 元素是否不存在 字串、列表、元組、字典

6.1.1 +

# 1. 字串 
str1 = 'aa'
str2 = 'bb'
str3 = str1 + str2
print(str3)  # aabb


# 2. 列表 
list1 = [1, 2]
list2 = [10, 20]
list3 = list1 + list2
print(list3)  # [1, 2, 10, 20]

# 3. 元組 
t1 = (1, 2)
t2 = (10, 20)
t3 = t1 + t2
print(t3)  # (10, 20, 100, 200)

6.1.2 *

# 1. 字串
print('-' * 10)  # ----------

# 2. 列表
list1 = ['hello']
print(list1 * 4)  # ['hello', 'hello', 'hello', 'hello']

# 3. 元組
t1 = ('world',)
print(t1 * 4)  # ('world', 'world', 'world', 'world')

6.1.3 in或not in

# 1. 字串
print('a' in 'abcd')  # True
print('a' not in 'abcd')  # False

# 2. 列表
list1 = ['a', 'b', 'c', 'd']
print('a' in list1)  # True
print('a' not in list1)  # False

# 3. 元組
t1 = ('a', 'b', 'c', 'd')
print('aa' in t1)  # False
print('aa' not in t1)  # True

6.2 公共方法

函式描述
len() 計算容器中元素個數
del 或 del() 刪除
max() 返回容器中元素最大值
min() 返回容器中元素最小值
range(start, end, step) 生成從start到end的數字,步長為 step,供for迴圈使用
enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。

6.2.1 len()

# 1. 字串
str1 = 'abcdefg'
print(len(str1))  # 7

# 2. 列表
list1 = [10, 20, 30, 40]
print(len(list1))  # 4

# 3. 元組
t1 = (10, 20, 30, 40, 50)
print(len(t1))  # 5

# 4. 集合
s1 = {10, 20, 30}
print(len(s1))  # 3

# 5. 字典
dict1 = {'name': 'Rose', 'age': 18}
print(len(dict1))  # 2

6.2.2 del()

# 1. 字串
str1 = 'abcdefg'
del str1
print(str1)

# 2. 列表
list1 = [10, 20, 30, 40]
del(list1[0])
print(list1)  # [20, 30, 40]

6.2.3 max()

# 1. 字串
str1 = 'abcdefg'
print(max(str1))  # g

# 2. 列表
list1 = [10, 20, 30, 40]
print(max(list1))  # 40

6.2.4 min()

# 1. 字串
str1 = 'abcdefg'
print(min(str1))  # a

# 2. 列表
list1 = [10, 20, 30, 40]
print(min(list1))  # 10

6.2.5 range()

# 1 2 3 4 5 6 7 8 9
for i in range(1, 10, 1):
    print(i)

# 1 3 5 7 9
for i in range(1, 10, 2):
    print(i)

# 0 1 2 3 4 5 6 7 8 9
for i in range(10):
    print(i)

注意:range()生成的序列不包含end數字。

6.2.6 enumerate()

  • 語法

enumerate(可遍歷物件, start=0)

注意:start引數用來設定遍歷資料的下標的起始值,預設為0。

  • 快速體驗

list1 = ['a', 'b', 'c', 'd', 'e']

for i in enumerate(list1):
    print(i)

for index, char in enumerate(list1, start=1):
    print(f'下標是{index}, 對應的字元是{char}')


6.3 容器型別轉換

6.3.1 tuple()

作用:將某個序列轉換成元組

list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}

print(tuple(list1))
print(tuple(s1))

6.3.2 list()

作用:將某個序列轉換成列表

t1 = ('a', 'b', 'c', 'd', 'e')
s1 = {100, 200, 300, 400, 500}

print(list(t1))
print(list(s1))

6.3.3 set()

作用:將某個序列轉換成集合

list1 = [10, 20, 30, 40, 50, 20]
t1 = ('a', 'b', 'c', 'd', 'e')

print(set(list1))
print(set(t1))

注意:

  1. 集合可以快速完成列表去重

  2. 集合不支援下標

6.4 總結

  • 運算子

    • +

    • in / not in

  • 公共方法

    • len()

    • del()

    • range()

    • enumerate()

  • 資料型別轉換

    • tuple()

    • list()

    • set()

7 推導式

7.1 列表推導式

作用:用一個表示式建立一個有規律的列表或控制一個有規律列表。

列表推導式又叫列表生成式。

7.1.1 快速體驗

需求:建立一個0-10的列表。

  • while迴圈實現

# 1. 準備一個空列表
list1 = []

# 2. 書寫迴圈,依次追加數字到空列表list1中
i = 0
while i < 10:
    list1.append(i)
    i += 1

print(list1)
  • for迴圈實現

list1 = []
for i in range(10):
    list1.append(i)

print(list1)
  • 列表推導式實現

list1 = [i for i in range(10)]
print(list1)

7.1.2 帶if的列表推導式

需求:建立0-10的偶數列表

  • 方法一:range()步長實現

list1 = [i for i in range(0, 10, 2)]
print(list1)
  • 方法二:if實現

list1 = [i for i in range(10) if i % 2 == 0]
print(list1)

7.1.3 多個for迴圈實現列表推導式

需求:建立列表如下:

[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
  • 程式碼如下:

list1 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list1)

7.2 字典推導式

思考:如果有如下兩個列表:

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

如何快速合併為一個字典?

答:字典推導式

字典推導式作用:快速合併列表為字典或提取字典中目標資料。

7.2.1 快速體驗

  1. 建立一個字典:字典key是1-5數字,value是這個數字的2次方。

dict1 = {i: i**2 for i in range(1, 5)}
print(dict1)  # {1: 1, 2: 4, 3: 9, 4: 16}
  1. 將兩個列表合併為一個字典

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1)
  1. 提取字典中目標資料

counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}

# 需求:提取上述電腦數量大於等於200的字典資料
count1 = {key: value for key, value in counts.items() if value >= 200}
print(count1)  # {'MBP': 268, 'DELL': 201}

7.3 集合推導式

需求:建立一個集合,資料為下方列表的2次方。

list1 = [1, 1, 2]

程式碼如下:

list1 = [1, 1, 2]
set1 = {i ** 2 for i in list1}
print(set1)  # {1, 4}

注意:集合有資料去重功能。

7.4 總結

  • 推導式的作用:簡化程式碼

  • 推導式寫法

# 列表推導式
[xx for xx in range()]

# 字典推導式
{xx1: xx2 for ... in ...}

# 集合推導式
{xx for xx in ...}