返回到Python知識體系 本節學習目的: 掌握數據結構中的列表和元組 應用場景: 編程 = 演算法 + 數據結構 數據結構: 通過某種方式(例如對元素進行編號)組織在一起的數據元素的集合,這些元素可以是數字或者字元,或者其他數據結構. 容器: 序列,映射,集合是三種比較常見的數據結構 序列: 每個元 ...
返回到Python知識體系
本節學習目的:
掌握數據結構中的列表和元組
應用場景:
編程 = 演算法 + 數據結構
數據結構: 通過某種方式(例如對元素進行編號)組織在一起的數據元素的集合,這些元素可以是數字或者字元,或者其他數據結構.
容器: 序列,映射,集合是三種比較常見的數據結構
序列: 每個元素都有一個編號,也叫做索引
映射: 每個元素都有一個名字,稱為鍵值對
集合: 內部元素都是不重覆的
聯繫本文作者交流或者索取相關代碼及軟體請加入QQ群:小馬哥的技術分享 413939157.
(一) 序列概覽
內建序列種類
列表和元組區別
列表和元組的應用場景
1,使用元組作為字典的鍵,因為鍵不可修改,所以就不能使用列表
2,需要操作一組數值的時候,序列很好用
序列裡面也可以包含其他序列
(二) 序列通用操作
2.1 索引
序列的特點就每個元素都有自己位置的編號,並且編號是在0開始的,用於找到某個位置上的元素.
正號索引: 開頭第一個元素,索引為0開始
負號索引: -1代表倒數第一個元素,-2代表倒數第2個元素,依次類推.
實例2.1.1
greeting = 'hello world'
print(greeting[0])
print(greeting[-1])
案例2.1.2
接收控制台輸入年月日,列印年月日的英文格式.
'''
1,輸入年月日
定義年月日三個變數分別接收輸入
定義兩個序列分別存儲對應的英文月日
2,格式化: 怎樣對輸入的月數字,轉變為英文-->索引
'''
year = input("請輸入年: ")
month = input("請輸入月份(1-12): ")
day = input("請輸入日期(1-31): ")
e_month = ['January','February','March','April','May','June','July','August','September','October','November','December']
e_day = ['st','nd','rd']+17*['th']+['st','nd','rd']+7*['th']+['st']
e_date = e_month[int(month)-1]+' '+e_day[int(day)-1]+' '+year
print(e_date)
2.2 分片
應用場景: 索引僅僅是取一個元素,如果要一次取一定範圍內的多個元素呢?
使用方法: 冒號分割的兩個索引表示邊界範圍,[開始索引: 結束索引] <-註意不包括結束索引位置上的元素
實例2.2.1 分片
greeting = 'hello world' #字元串長度是11
print(greeting[0:1])
print(greeting[0:11])
問題: 如果對分片修改會修改原字元串嗎?
實例2.2.2 訪問最後面n個元素
numbers = [1,2,3,4,5,6,7,8,9,10]
print(numbers[7:11])
# [8, 9, 10] 訪問序列的後面三個元素
print(numbers[-1:-3])
# [] 沒有數據的原因: 左邊界索引一定要小於右邊界索引
print(numbers[-3:-1])
# [8, 9] 只有兩個元素的原因: 半開半閉區間,只包括左邊界索引位置上的元素,不包括右邊界索引位置上的元素
print(numbers[-3:])
# [8, 9, 10] 預設寫右邊界索引: 這樣範圍就是預設取到最後一個元素
print(numbers[:-1])
# [1, 2, 3, 4, 5, 6, 7, 8, 9] 預設寫左邊索引: 範圍預設在第一個元素開始取
print(numbers[:])
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 兩個邊界都預設: 範圍就是全部了
上面的分片都是挨個取元素,也就是步長為1,還可以設定步長取出元素
#預設步長的分片如上面,其實是預設了一個參數
print(numbers[0:11:1])
#設定步長的分片
print(numbers[0:11:2])
2.3 相加/連接
本質: 連接操作
操作: 連接操作
print([1,2,3,4,5]+[6,7,8,9,10])
print('hello '+ 'world')
print([1,2,3,4,5]+'hello world')# 註意:這裡是要拋錯的,Python是強數據類型,也就是不會自動隱式轉換數據類型,所以在這裡只有兩種相同數據類型的序列才能相加
2.4 乘法
其實在上面已有例子使用到了數列的乘法,本質上就是多個數列相加
[1,2,3,4,5]*10
‘string’*10
實例2.4.1 創建一個10個元素的序列,但是裡面上面都不存
[none]*10
none = [None]*10
print(len(none)) #現在還學到長度,這是我猜的一個函數
2.5 成員資格
用於檢查某個元素是否屬於序列的成員,使用布爾運算符in
返回值成為布爾值: 條件為真返回True,為假返回False.
print(None in none) #返回True
print('P' in 'python') #返回False
# 查看用戶名和密碼是否存在
accout = [['mali','123'],['hadoop','java'],['spark','scala'],['ml','python'],['google','go']]
print(['mali','123'] in accout) #返回True
print('mali' in accout) #返回False
2.6 長度,最小值,最大值
查看列表長度: len函數
min函數: 序列中最小的元素
max函數: 序列中最大的元素
實例2.6.1
print(len(account))
print(max(account))
print(min(account))
>>> max('java','Java','scala','python')
'scala'
>>> min('java','Java','scala','python')
'Java'
(三) 列表
3.1 列表的特點
字元串不能修改,於是可以將字元串轉變為列表處理
列表是可以對元素進行增刪改查的
3.2 list函數
先看如下代碼,可以對字元串進行拼接,可以根據索引查詢字元串
content = "hello python"
print("a"+"b")
print(content+'a')
print(content[0])
但是,如果修改字元串某個位置上的字元是否能成功呢?
>>> content = "hello python"
>>> content[0]='a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
結果是直接拋錯
如何滿足修改字元串的需求呢?
list函數可以將一個字元串轉成一個列表類型,其實這個強轉’123’到123一樣的道理: int(‘123’)
>>> list(content)
['h', 'e', 'l', 'l', 'o', ' ', 'p', 'y', 't', 'h', 'o', 'n']
3.3 基本的列表操作
前面序列的通用操作中各種方法都適用於list,並且list還有自己的獨特操作,上面字元串不能修改,list可以修改就是一種,還有下麵的
- 修改列表元素
>>> list(content)
['h', 'e', 'l', 'l', 'o', ' ', 'p', 'y', 't', 'h', 'o', 'n']
>>> chars = list(content)
>>> chars
['h', 'e', 'l', 'l', 'o', ' ', 'p', 'y', 't', 'h', 'o', 'n']
>>> chars[0] = 'H'
>>> chars
['H', 'e', 'l', 'l', 'o', ' ', 'p', 'y', 't', 'h', 'o', 'n']
註意: 不能為一個位置不存在的元素進行賦值
>>> len(chars)
12
>>> chars[12]='!'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
- 刪除元素
使用del函數
>>> nums = [1,2,3,4,5,6]
>>> nums
[1, 2, 3, 4, 5, 6]
>>> del(nums[5])
>>> nums
[1, 2, 3, 4, 5]
>>> len(nums)
5 #長度變為5
- 分片賦值
作用: (1)同時為多個元素進行賦值; (2)替換;(3)還可以用來插入;
實例1: 賦值與追加
>>> name = list("hadoop")
>>> name
['h', 'a', 'd', 'o', 'o', 'p']
>>> name[6:] = list("空格java")
>>> name
['h', 'a', 'd', 'o', 'o', 'p', ' ', 'j', 'a', 'v', 'a']
實例2: 替換/修改元素
>>> name
['h', 'a', 'd', 'o', 'o', 'p', ' ', 'j', 'a', 'v', 'a']
>>> name[7:] = list("python")
>>> name
['h', 'a', 'd', 'o', 'o', 'p', ' ', 'p', 'y', 't', 'h', 'o', 'n']
實例3: 插入元素
>>> name
['h', 'a', 'd', 'o', 'o', 'p', ' ', 'p', 'y', 't', 'h', 'o', 'n']
>>> name[0:0] = list('hello ') #因為分片是半開半閉區間,所以這個時候分片是空的,這個操作也就變成插入了
>>> name
['h', 'e', 'l', 'l', 'o', ' ', 'h', 'a', 'd', 'o', 'o', 'p', ' ', 'p', 'y', 't', 'h', 'o', 'n']
分片也是可以用來刪除的,del函數
3.4 列表方法
方法: 通過對象調用的函數
使用: 對象.方法(參數)
1,append
2,count
3,extend
4,index
5,insert
6,pop
7,remove
8,reverse
9,sort
10,高級排序
(四) 元組
定義: tuple也是序列,和序列中的列表list不同的是,元組tuple不能修改(字元串也是不能修改的)
使用:
創建一個tuple,通過圓括弧定義,或者直接逗號分隔的一些值
>>> 1,2,3
(1, 2, 3)
>>> ('a','b','c')
('a', 'b', 'c')
>>> t1 = ('java','scala','python','go','javascript')
>>> t1
('java', 'scala', 'python', 'go', 'javascript')
>>> type(t1)
<class 'tuple'>
空元組: ()
>>> type(())
<class 'tuple'>
特別註意: 一個元素的元組,也是元組,但是形式要特別註意
>>> a = ('a') #雖然也包括在圓括弧裡面,但是檢查類型, 是str
>>> type(a)
<class 'str'>
>>> b = ('b',) #儘管只有一個元素,也要加上逗號
>>> type(b)
<class 'tuple'>
再例如:
>>> 100 #這是一個數
100
>>> 100, #加上逗號,這是一個元組
(100,)
再看一個例子:
>>> 10*(100+100) #在這裡沒有逗號,屬於四則運算,括弧輸入運算符號
2000
>>> 10*(100+100,) #在這裡有逗號,屬於元素,對裡面的元素進行拼接
(200, 200, 200, 200, 200, 200, 200, 200, 200, 200)
tuple函數
tuple函數和list函數一樣,將參數(參數在這裡是序列)轉換為元組,其實就是類型轉換
>>> ittech = ['hadoop','spark','storm','kylin','hive','hbase']
>>> ittech
['hadoop', 'spark', 'storm', 'kylin', 'hive', 'hbase'] #註意括弧: 是中括弧
>>> type(ittech)
<class 'list'> #註意這裡
>>>
>>> t_ittech = tuple(ittech)
>>> t_ittech
('hadoop', 'spark', 'storm', 'kylin', 'hive', 'hbase') #註意括弧: 是圓括弧
>>> type(t_ittech)
<class 'tuple'> #註意這裡
基本元組操作
元組只有創建和訪問操作.訪問操作和其他序列一樣,通過索引訪問,也有分片訪問操作
元組的存在意義
在映射中當做鍵使用,不可以被改變
返回到Python知識體系
聯繫本文作者交流或者索取相關代碼及軟體請加入QQ群:小馬哥的技術分享 413939157.