Python小白學習筆記四(容器型別 2 列表 )

2020-08-13 12:02:56

Python小白學習筆記四(容器型別 2 列表 )

容器型別 2 列表

列表 list

定義:由一系列變數組成的可變序列容器。
  基礎操作
1.建立列表:

			列表名 = []   
			列表名 = list(可迭代物件)

2.新增元素:

			列表名.append(元素) (追加)
			例如:list_name.append("姓名") #將姓名加到末尾
			列表.insert(索引,元素) (插入)
			如:list.insert(2, "內容") # 2是位置
			例如:list_names.insert(2, "張天旺")

3.定位元素:

			列表名[索引] = 元素
			變數 = 列表名[索引]
			變數 = 列表名[切片] # 賦值給變數的是切片所建立的新列表 
			列表名[切片] = 容器 # 右側必須是可迭代物件,左側切片沒有建立新列表。

遍歷列表:

			正向:
					for 變數名 in 列表名:
					變數名就是元素
			反向:
					for 索引名 in range(len(列表名)-1,-1,-1):
					列表名[索引名]就是元素

4.刪除元素:

				列表名.remove(元素)
				del 列表名[索引或切片]
 1 #    列表 -- 基礎操作
 2         定位
 3 #        遍歷
 4 list_names = ["馬偉帥", "秦世傑", "喬海瑞", "錢濤"]
 5 # 定位
 6 # -- 索引:容器名[整數]
 7 # -- 1. 讀取
 8 element = list_names[-1]
 9 print(element)
10 # -- 2. 修改
11 list_names[-1] = "濤濤"
12 print(list_names)
13 
14 # -- 切片:容器名[整數:整數:整數]
15 # -- 1. 通過切片讀取,建立新列表(拷貝)
16 names = list_names[:3]
17 print(names)
18 # -- 2. 通過切片修改,遍歷右側數據,依次存入左側.
19 list_names[:3] = ["帥帥帥", "秦秦", "瑞瑞"]
20 # list_names[:3] = 100 # 因爲100不能被for
21 # list_names[:3] = "孫悟空"
22 print(list_names)
23 
24 # 遍歷:操作容器每個元素
25 # -- 方式1: for 元素 in 容器
26 # 適用性:從頭到尾依次讀取
27 for name in list_names:
28     print(name)
29 
30 # -- 方式2:for 索引 in range(開始,結束,間隔):
31 # 適用性:不能用方式1
32 # len(list_names) - 1 是 最大索引(總數-1)
33 # -1 索引可以去到0
34 # -1 倒序
35 
36 # 功能:倒序
37 for i in range(len(list_names) - 1, -1, -1):
38     print(list_names[i])
39 
40 # 功能:修改
41 for i in range(len(list_names)):
42     # 文字長度是3的修改爲None
43     if len(list_names[i]) == 3:
44         list_names[i] = None
1 #    列表 -- 基礎操作
2 #        刪除
3 list_names = ["馬偉帥", "秦世傑", "喬海瑞", "錢濤"]
4 # -- 方式1:根據元素刪除  列表名.remove(元素)
5 list_names.remove("喬海瑞")
6 
7 # -- 方式2:根據定位刪除 del 容器名[索引或者切片]
8 del list_names[0]
9 del list_names[-2:]

深拷貝和淺拷貝
    淺拷貝:複製過程中,只複製一層變數,不會複製深層變數系結的物件的複製過程。
    深拷貝:複製整個依懶的變數。

例如:
import copy
list01 = ["北京",["上海","深圳"]]
list02 = list01
list03 = list01[:]
list04 = copy.deepcopy(list01)
list04[0] = "北京04"
list04[1][1] = "深圳04"
print(list01) # 修改深拷貝後的數據,不影響拷貝前
list03[0] = "北京03"# 修改第一層,不影響拷貝前
list03[1][1] = "深圳03"# 修改第二層,影響拷貝前
print(list01) # ?
list02[0] = "北京02"# 等同於修改list01
list02[1][1] = "深圳02"
print(list02) # ?

便於理解,畫了個記憶體圖
記憶體圖分析:
在这里插入图片描述
在这里插入图片描述

列表與字串轉換
 (1)將多個字串拼接爲一個。

				result = "連線符".join(列表)
				result = "".join(列表)

(2)將一個字串拆分爲多個。

				str --> list
				列表 = 「a-b-c-d」.split(「分隔符」)
				列表 = 「a-b-c-d」.split(「-」)

列表推導式
  定義:使用簡易方法,將可迭代物件轉換爲列表。
    語法:

					變數 = [表達式 for 變數 in 可迭代物件]
					變數 = [表達式 for 變數 in 可迭代物件 if 條件]

說明:

如果if真值表達式的布爾值爲False,則可迭代物件生成的數據將被丟棄。

列表推導式巢狀
語法:

		變數 = [表達式 for 變數1 in 可迭代物件1 for 變數2 in可迭代物件2]

傳統寫法

		result = []
		for r in  ["a", "b", "c"]:
	   	    for c in ["A", "B", "C"]:
	            result.append(r + c)

推導式寫法

          result = [r + c for r in list01 for c in list02]

python語言有哪些數據型別:

答:可變物件:例如,列表
         特點:預留空間(動態)
    不可變物件:例如,數值/str/元組...
         特點:按需分配(省記憶體,但是不可變)

例1.

1 #    list -- > str
 2     將多個字串拼接爲一個。
 3 #    result = "連線符".join(列表)
 4 
 5 list01 = ["a", "b", "c"]
 6 result = "#".join(list01)
 7 print(result)
 8 
 9 # 需求:根據xx邏輯回圈拼接字串
10 # result = ""
11 # for number in range(10):  # 0~9
12 #     # 每次回圈  建立新字串  產生一個垃圾
13 #     result += str(number)  # "1"  + "2"  -> "12"
14 # print(result)
15 
16 # 核心思想:用可變物件代替不可變物件
17 result = []
18 for number in range(10):  # 0~9
19     # 每次追加都在原列表基礎上,沒有建立新列表
20     result.append(str(number))
21 result = "".join(result)
22 print(result)

例2.

1 #    str --> list
 2 #    將一個字串拆分爲多個。
 3 #    列表 = 「a-b-c-d」.split(「分隔符」)
 4 
 5 result = "a-b-c-d".split("-")
 6 print(result)
 7 # 應用:取出一個字串表達的多種資訊
 8 # "悟空,豬八戒,唐僧"
 9 datas = "悟空,豬八戒,唐僧".split(",")
10 print(datas)

例3.

1 #    列表推導式
 2 #        使用簡易方式建立列表
 3 #            [操作變數 for 變數 in 可迭代物件 if 條件]
 4 
 5 # list_result = []
 6 # for number in range(1,11):
 7 #     if number % 2:
 8 #         list_result.append(number)
 9 
10 list_result = [number for number in range(1, 11)
11                if number % 2]
12 print(list_result)
13 # list_result = []
14 # for number in range(1,11):
15 #         list_result.append(number ** 2)
16 list_result = [number ** 2 for number in
17                range(1, 11)]