1. 程式人生 > >Python容器:列表、元組、字典、集合

Python容器:列表、元組、字典、集合

文章目錄

序言

  • 此文章針對有一定基礎的人,簡明扼要的介紹字串、列表、元組、字典、集合的概念和常用操作,以備複習鞏固之用。

  • 底層的基本資料型別:布林型,整形,浮點型以及字串型別。

  • 基本資料型別組合起來稱之為資料結構。

    • 資料結構:列表、元組、字典、集合。

序列

  • 序列:一系列元素以它們所處的位置為索引,以第一個到最後一個依次編號就組成一個序列。
  • 序列結構:字串、元組和列表都是序列結構,但是它們又有各自的特點。
    • 元組和列表與字串不同的是,元組和列表並不是求所含元素的種類相同,每個元素都可以是任何Python型別的物件。
    • 元組和列表不同的是,元組是不可變的,元組被賦值後,這些值就會被固定在元組中,不會被修改,而列表中的值還可以進行插入、刪除等操作。

字串(string)

  • 字串是我們首先要接觸到的Python序列型別,其本質為字元序列,Python字串不可改變,無法對原字串進行修改,但是可以將字串的一部分複製到新的字串中。

建立字串

  • 1.1 單引號
    • 雙引號
    • 三個單引號:建立多行字串
'example1'
"example2"
'''example3,
example4
continue'''
  • 1.2 使用str()轉換
str(123)
'123'
#注意用print輸出的差別,沒有引號
print(str(123))
123

字串的簡單操作

  • \轉義
    • \n
    • \t
    • "
  • +拼接
#注意,one後面有個空格
使用 + 進行拼接
'one '+'two'
'one two'
直接寫在後面也可以拼接
'one ''two'
'one two'
  • *複製

  • []中括號提取

#注意,偏移量不能超過字串長度
vocabulary = 'transcendental'
vocabulary[0]
't'
vocabulary[-1]
'l'
  • [start : end : step]字串分片
#:引號不可省略,其他的都可以省略
#[:] 提取全部
#[:end] 開始到end - 1
#[start:end:step]定步長擷取
#負號的使用可以帶來許多有意思的操作,比如步長為-1,那麼將會反向輸出字串
#在這裡允許偏移量超過字串長度
vocabulary = 'transcendental'

相關操作函式

  • len()獲取字串函式
  • split()分割
  • join()合併
  • replace()替換字串
  • startswith()判斷字串開始字元是否為某個字串
  • find()查詢某個字元的開始的偏移量
  • rfind()查詢某個字元的最後的偏移量
  • count()統計某個字元出現的次數
  • title()所有單詞開頭字母變大寫
  • upper()所有字母大寫
  • lower()所有字母小寫
  • swapcase()大小寫轉換
  • split()分割
#split基於分隔符分割字串,分割成為列表
#逗號為分隔符,分割program_ex 
program_ex = 'hello,world'
program_ex.split(',')
['hello','world']
  • join()合併
#與split邏輯相反
#呼叫順序:首先指定粘合用的字串,然後指定需要粘合的列表
#string.join(list)
crypto_list = "'Yeti', 'Bigfoot', 'Loch Ness Monster'"
ctypto_string = ','.join(crypto_list)
print('Found and signing book deals:',ctypto_string)
Found and signing book deals:Yeti, Bigfoot, Loch Ness Monster
  • replace()替換字串
#引數 需要被替換的子串,用於替換的子串,需要替換次數
#將三個o替換成X
crypto_list = "'Yeti', 'Bigfoot', 'Loch Ness Monster'"
crypto_list_replace = crypto_list.replace('o','X',3)
print(crypto_list_replace)
['Yeti', 'BigfXXt', 'LXch Ness Monster']

列表(list)

建立列表

  • 1.1:中括號[ ]或者list( )建立列表
empty_list = []
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']

another_empty_list = list()
  • 1.2:使用list()轉換
#字串轉換
list('cat')
['c','a','a']

#元組轉換
a_tuple = ('ready','fire','aim')
list(a_tuple)
['ready','fire','aim']
  • 1.3 split分割,參見字串中的split()
  • 1.4(高階方式):列表推式(一種從一個或者多個迭代器快速簡潔地建立資料結構的一種方法,將迴圈和條件判斷結合,避免語法冗長)
  • 表示式:
    • [expression for item in iterable]
    • [expression for item in iterable if condition]
number_list = [number for number in range(1,6)]
number_list
[1,2,3,4,5]
a_list = [number for number in range(1,6) if number % 2 == 1]
a_list
[1,3,5]
  • 迴圈巢狀
    • 建立一個元組,其中元組第一項由迴圈1控制,第二項由迴圈2控制。
    • [(iterable1,iterable2) for item in iterable1 for item in iterable2]
    • example:
列表推導模式
rows = range(1,4)
cols = range(1,3)
cells = [(row,col) for row in rows for col in cols]
	for cell in cells:
		print(cell)
(1 1)
(1 2)
(2 1)
(2 2)
(3 1)
(3 2)

普通模式
rows = range(1,4)
cols = range(1,3)
	for row in rows:
		for col in cols:
			print(row,col)
1 1
1 2
2 1
2 2
3 1
3 2

列表的簡單操作

  • 獲取列表元素
    • 通過偏移量(offse)獲取對應位置的元素
    • 表示式:list_number[offset]
#正偏移量
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly[0]
'Monday'
weekly[1]
'Tuesday'
#負偏移量,從尾數開始計數
weekly[-1]
'Friday'
  • 列表的巢狀:列表中可以包含各類元素,也可包含其它列表。
#列表3中的元素型別包含整形,字串,陣列
list1 = ['Wednesday','Friday']
list2 = [3,'apple',4,'TV']
list3 = [list1,'helloworld',list2,8,5]
#訪問列表3中第一元素
list3[0]
['Wednesday','Friday']
#通過列表3訪問列表2中第一個元素
list3[2][1]
3
  • 修改列表元素
    • 通過偏移量(offset)修改列表元素
#使用偏移量無法更改字串中的指定字元,因為字串本身不可變。
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly[1] = 'correct'
['Monday','Tuesday','correct','Thursday','Friday']
  • 指定範圍的列表切片
#獲取子序列
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly[0:2]
['Monday','Tuesday']
#設定步長:每兩個元素提取一個
weekly[::2]
['Monday','Wednesday','Friday']
#列表逆序,同樣使用負號可以產生很有意思的事情
weekly[::-1]
['Friday','Thursday','Tuesday','Wednesday','Monday']

列表函式

  • append()

  • extend()

  • insert()

  • del()

  • remove()

  • pop()

  • index()

  • in()

  • =賦值

  • copy()

  • append():列表後追加元素

# 插入Saturday
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.append('Saturday')
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
  • extend()或者+=:列表合併,將一個列表加入到另一箇中,成為一個列表。
# 合併列表
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekend =['Saturday','Sunday']
weekly.extend(weekend)
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

weekly += weekend
weelkly
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

  • insert()
# 插入Saturday
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.insert(5,'Saturday')
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
  • del()
# 刪除Friday,del為Python語句,而不是list方法,所以不能用  .  呼叫
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
del weekly[4]
weekly
['Monday','Tuesday','Wednesday','Thursday']
  • remove()
# 刪除Friday,remove是list方法
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.remove('Friday')
weekly
['Monday','Tuesday','Wednesday','Thursday']
  • pop()
# 獲取元素後刪除,且pop()的,預設只為-1,刪除尾元素,因此pop(0)=pop(-1),可以用pop(0)獲取並刪除首元素
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.pop()
'Friday'
weekly
['Monday','Tuesday','Wednesday','Thursday']
  • index():插入特定值的元素位置
#返回指定值的位置資訊
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
weekly.index('Monday')
0
  • in():判斷存在
# 判斷Sunday是否在weekly中
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
'Sunday' in weekly
False
  • count():統計特定值的出現次數
weekly.count('Wednesday')
  • join()
    • 字串方法的擴充,參見字串方法中的join
  • sort()和sorted()
# sort對原列表進行排序,sorted對原列表生成副本後排序,原列表內容不變
marxes = ['Groucho','Chico','Harpo']
sorted_marxes = sorted(marxes)
sorted_marxes
['Chico','Groucho','Harpo']

marxes = ['Groucho','Chico','Harpo']
marxes.sort()
marxes
['Chico','Groucho','Harpo']
  • len()
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
a = len(weekly)
print(a)
5
  • in()
# 賦值後weekly = Weekly,改變其中一個,另一個隨之改變
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
Weekly = weekly
  • copy()
# copy()
# list()
#列表分片
#用以上方法產生的新列表和元列表沒有內在聯絡,即改變其中任何一個,其它的不受影響
a = [1,2,3]
b = copy(a)
c= list(a)
d = a[:]

a[0] = '100000000000'
b = [1,2,3]
c = [1,2,3]
d = [1,2,3]

元組(tuple)

  • 元組與序列類似,也是由任意元素組成的序列,但是元組一旦建立如同字串,不可改變。

元組的建立

  • 使用()建立空元組
#建立空元組
empty_tuple = ()
()
  • 使用逗號’,'建立元組
#建立一個元素的元組,最後','不可省略
one_marx = 'martrix',
( 'martrix',)

#建立多個元素的元組,最後的','可省略
another_martx =  'martrix','array'
 ('martrix','array')
  • 元組解包(元組賦值操作)
another_martx =  'martrix','array'
a,b = another_martx
a 
'martrix'
b
'array'
元組解包的經典操作,交換變數的值
one = 'martrix'
two =  'array'
two,one = one,two
one
'array'
two
'martrix'
  • tuple建立
weekly = ['Monday','Tuesday','Wednesday','Thursday','Friday']
tuple(weekly)
('Monday','Tuesday','Wednesday','Thursday','Friday')
  • 元組的不可更改由其獨特的優點,在以後的應用中可以用到,但是一般情況下多用列表和字典。

字典(dict)

  • 字典中的元素順序無關緊要,通過不同的鍵(key)進行訪問,字典是可以改變的,和現實的字典類似。
  • 字典在其它的語言中被稱為關係型陣列,雜湊表,雜湊圖等。

字典的建立

  • 使用大括號{key:value}建立
#空字典
empty_dic = {}
#鍵值對的字典
one_dict = {"day1":study
"day2":paly
"day3":sleep
}
empty_dic
{"day1":study
"day2":paly
"day3":sleep
}
  • 使用dict()建立
#將包含雙值的子序列的序列轉換成字典,第一值為鍵,第二個值為值
one_list = [[1,'a'],[2,'b']]
dict(one_list)
{1:'a',2:'b'}
#可以將雙值的,雙字元,元組,列表化成字典。
tos = ('ab','cd','ef')
dict(tos)
{'c':'d','a':'b','e':'f'}

字典的相關操作

  • [key]儲存,訪問,新增或者修改元素
#儲存一個元素
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
   }
 d2 = d['three']
 d2
 ['three':3]
#訪問一個元素,如果不存在會報錯
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
   }
   d['one']
   123
#新增一個元素,然後修改這個元素
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
   }
#新增元素'try':55
d['try'] = '55'
d
d = {
    'one':123,
    'two':2,
    'three':3,
    'test':2
    'try':55
   }
修改元素555
d['try'] = '5'

字典的函式

  • update()合併字典
  • del()刪除具有指定鍵的元素
  • clear()刪除所有元素,變成空字典
  • in()判斷是否存在
  • get()獲取鍵對應元素,[key]不同是,不會報錯
  • keys()獲取所有鍵
  • values()獲取所有值
  • item()獲取所有鍵值對
  • =賦值
  • copy()複製
    用法參見list

集合(set)

  • 集合和只剩下的鍵的字典類似,鍵與鍵之間不允許重複,類似數學中的集合,主要包括並、交等運算,且集合是無序的。

集合的建立

  • 用{}大括號將一系列用逗號隔開的值包裹起來。
  • 用set函式建立
  • 將其他型別轉換成集合
#空集合
empty_set = set()
empty_set
set()
#偶數集合
even_numbers = {0,2,4,6,8}
even_numbers
{0,2,4,6,8}
#轉換字串,不包含重複的鍵
set('letters')
{‘l’,‘e’,‘t’,'r','s'#轉換列表
set(['Dasher','Dancer','Prancer','Mason-Dixon'])
{'Dasher','Dancer','Prancer','Mason-Dixon'}
#轉換元祖
set(('Monday','Tuesday','Wednesday','Thursday','Friday'))
{'Monday','Tuesday','Wednesday','Thursday','Friday'}
#轉換字典,注意只保留鍵
set({'apple':'red','flower':'blue','tree':'green'})
{'apple','flower','tree'}

集合的相關函式

  • 用in測試值是否存在
for name,contents in drinks.items():
	if 'vodka' in contents:
		print(name)

screwdriver
martini
black russin
white russin
#選擇vodka,但是不要vermouth,且不是cream
for name,contents in drinks.items():
if 'vodka' in contents and not ('vermouth' in contents or 'cream' in contents):
	print(name)
screwdriver
black russin
  • intersection() 或者& 獲取交集
drinks ='martini' : {'vodka','vermouth'}
	'black russin' : {'vodka','kahlua'}
	'white russin' : {'cream','kahlua','vodka'}
	'manhattan' : {'rye','vermouth','bitters'}
	'screwdriver' : {'orange juice','vodka'}for name,contents in drinks.items():
	if contents & {'vermouth','orange jucice'}
		print(name)
screwdriver
martini
manhattan

for name,contents in drinks.items():
	if 'vodka' in contents and not contents & {'vermouth','cream'}:
		print(name)
screwdriver
black russin

a和b的