4.1 列表的創(chuàng)建和取值
列表中的數(shù)據(jù)按順序排列
列表有正序(0開始)與倒序(從右到左開始,-1開始)兩種索引
列表可以存儲(chǔ)任意類型數(shù)據(jù)妥泉,且可以重復(fù)
# 列表的取值
list = ['張三', '趙六', '李四', '王五', '趙六', '錢七', '孫八']
print(list)
# 取值的語法: 變量 = 列表變量[索引值]
zhaoliu = list[3]
print(zhaoliu)
zhaoliu = list[-3]
print(zhaoliu)
# 范圍取值: 列表變量 = 原列表變量[起始索引:結(jié)束索引]
# 在Python中列表范圍取值是"左閉右開"
list1 = list[1: 4]
print(list1)
print(list1[-1])
# 列表的index函數(shù)用于獲取指定元素的索引值
zhaoliu_index = list.index('趙六')
print(zhaoliu_index)
4.2 遍歷列表(for循環(huán))
for .. in語句
for .. in語句專門用于遍歷列表椭微、元組等數(shù)據(jù)結(jié)構(gòu)
語法格式
for 迭代變量 in 可迭代對(duì)象:
循環(huán)體(必須縮進(jìn))
numList = [1,2,3,4,5,6,7,8,9,10]
for num in numList:
if num % 2 == 0:
print(num)
4.3 列表的反轉(zhuǎn)與排序
*反轉(zhuǎn):變量.reverse()
*排序:變量.sort() 默認(rèn)按照升序排列
變量.sort(reverse=True) 降序排列
numbers = [28,32,14,12,53,42]
print(number.reverse())
print(number.sort(reverse = True) )
冒泡排序
1.比較相鄰的元素,如果第一個(gè)比第二個(gè)大盲链,就交換他們兩個(gè)
2.對(duì)每一對(duì)相鄰元素做同樣的工作蝇率,從開始第一對(duì)到結(jié)尾的最后一對(duì)迟杂,最后的元素應(yīng)為最大值
3.針對(duì)所有的元素重復(fù)以上的步驟,出了最后的元素
4.持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟本慕,直到?jīng)]有任何一對(duì)數(shù)字需要比較
numbers = [28,32,14,12,53,42,]
for i in range(len(numbers)-1):
for j in range(len(numbers)-1-i):
if numbers[j] > numbers[j+1]:
numbers[j],numbers[j+1] = numbers[j+1],numbers[j]
print(numbers)
4.4 列表的增刪改查操作
list.append(新元素) 在列表末端追加新元素
list.insert(索引,新元素) 在指定索引插入新元素
list[索引] = 新值 更新指定索引位置數(shù)據(jù)
list[起始索引:結(jié)束索引] = 新列表 更新指定范圍數(shù)據(jù)
list.remove(元素) 刪除指定元素
list.pop(索引) 按索引刪除指定元素
list.pop[起始索引:結(jié)束索引] = [] (指定索引區(qū)間內(nèi)的元素全部刪除)
people = ['張三' , '李四' , '王五' , '趙六' , '錢七' , '孫八']
#插入新元素
people.insert(1,'趙五' )
print(people)
#更新指定索引位置數(shù)據(jù)
people[1] = '趙六'
print(people)
#刪除指定元素
people.remove( '孫八')
print(people)
#按索引刪除指定元素
people.pop(5)
#統(tǒng)計(jì)出現(xiàn)次數(shù)
cnt = people.count('趙六') #返回2排拷,出現(xiàn)兩次
#追加操作
people.append(['楊九' , '吳十' ]) #真正的情況是,在原列表內(nèi)部尾端又增加了一個(gè)包含楊九吳十的新列表锅尘。
people.extend(['楊九' ,'吳十']) #extend 則是將列表中的元素追加到原始列表末端
print(people)
#in運(yùn)算符用于判斷數(shù)據(jù)是否在列表中存在监氢,存在:True, 不存在: False
b = '張三' in people
print(b) #返回True
#copy 函數(shù)用于復(fù)制列表
people1 = people.copy( ) #如果改變people列表,people1列表是不受影響的藤违,因?yàn)樗鼈儌z是完全不同的存儲(chǔ)浪腐。
people2 = people #people2 和 people列表時(shí)刻保持一致
print(people1)
#is 身份運(yùn)算符用于判斷兩個(gè)變量是否指向同一塊內(nèi)存
print(people1 is people) #返回False
print(people2 is people) #返回True
#clear 用于清空列表
people.clear( ) #返回一個(gè)空的列表 [ ]
print(people) #空列表
print(people1) #完全不受影響
print(people2) #與people列表保持一直,返回空列表
4.5 字典的創(chuàng)建
字典采用鍵(key):值(value)形式表達(dá)數(shù)據(jù)
字典中key不允許重復(fù)顿乒,value允許重復(fù)
字典是可修改的议街,運(yùn)行時(shí)動(dòng)態(tài)調(diào)整存儲(chǔ)空間
#字典的創(chuàng)建
dict1 = { } #空的字典
dict2 = {'name':' 張三', 'sex': '男'}
print(type(dict2)) #輸出結(jié)果為dict
#利用dict函數(shù)創(chuàng)建字典
dict3 = dict(name='wangfeng',sex='male',hiredate='1997-10-20')
dict4 = dict.fromkeys(['name' , 'sex' , 'hiredate' , 'grade'] , 'N/A'] # 給字典設(shè)置默認(rèn)值,默認(rèn)值為None
4.6 字典的取值
employee = {'name':' 張三', 'sex': '男','salary':2000,'job':'A'}
#字典的取值
name = employee['name']
print(name)
salary = employee['salary']
print(salary)
#輸出其他部門淆游,get函數(shù)可以給不存在的鍵加默認(rèn)值
print(employee.get('job'))
print(employee.get('dept' , '其他部門'))
#如何判斷某一個(gè)key在字典中是否存在
#in 和 not in 成員運(yùn)算符
print('name' in employee) #只是對(duì)key進(jìn)行判斷傍睹,返回True
print('dept' in employee) #不存在的key,返回False
#如何遍歷字典
for key in employee:
v = employee[key] #可以獲取到每一個(gè)key所對(duì)應(yīng)的值
print(v)
#items 包含的是每一個(gè)鍵值對(duì)
for key,value in employee.items():
print(key)
print(value )
4.7 字典更新與刪除
employee = {'name':' 張三', 'sex': '男'}
#字典更新/添加,原字典就有的k則更新v犹菱,沒有的就添加一個(gè)拾稳。
employee.update(salary= 2000,welfare = 1000 )
employee['grade '] = 'A'
print(employee)
#字典刪除,刪除對(duì)應(yīng)的k所在的鍵值對(duì)
employee.pop('welfare')
print(employee)
#刪除該字典中最后一個(gè)鍵值對(duì)
employee.popitem()
print(employee)
#清空字典
employee.clear()
print(employee)
4.8 字典的其它操作
emp = {'name':' 張三', 'sex': '男'}
#字典設(shè)置默認(rèn)值
emp.setdefault('grade','c')
#視圖對(duì)象
ks = emp.keys() #所有的鍵
print(ks)
vs = emp.values() #所有的值
print(vs)
its = emp.items() #所有的鍵值對(duì)
print(its)
#原始數(shù)據(jù)變化,視圖跟上變化
emp['hiredate'] = '1996-2'
print(ks)
print(vs)
print(its)
#老版本格式化輸出字典: 結(jié)構(gòu) "%(key)s,%(key)s" %emp
str="姓名:%(name)s,評(píng)級(jí):%(grade)s,入職時(shí)間:%(hiredate)s" %emp
#新版本的字符串格式化
emp_str = "姓名{name},評(píng)級(jí):{grade},入職時(shí)間:{hiredate}".format_map(emp)
4.9 散列值與字典的存儲(chǔ)原理
散列值(Hash)
*字典也稱為“哈希(Hash)”腊脱,對(duì)應(yīng)“散列值”
*散列值是從任何一種數(shù)據(jù)中創(chuàng)建數(shù)字“指紋”
*python中提供了hash()函數(shù)生成散列值
*hash("str") 相同的str在每一次運(yùn)行時(shí)對(duì)應(yīng)的散列值是一樣的
*int 的哈希值是它本身
字典的存儲(chǔ)原理
字典保存時(shí)访得,字典的key會(huì)經(jīng)過hash()函數(shù)進(jìn)行轉(zhuǎn)換,轉(zhuǎn)成對(duì)應(yīng)散列值陕凹,根據(jù)散列值在內(nèi)存中開辟一段空間悍抑,這段內(nèi)存會(huì)預(yù)留出空閑的空間,將哈希值經(jīng)過換算后找到對(duì)應(yīng)的內(nèi)存地址杜耙,將數(shù)據(jù)保存的對(duì)應(yīng)的內(nèi)存地址中搜骡。
數(shù)據(jù)并不是連續(xù)存儲(chǔ)的,和列表佑女、元組都不一樣记靡,在內(nèi)存中分散存儲(chǔ);數(shù)據(jù)保存也不是按照key的順序保存的团驱;字典的數(shù)據(jù)提取速度的極快的摸吠,因?yàn)樵趦?nèi)存中保存的具體的散列值,散列值對(duì)應(yīng)了唯一的內(nèi)存地址嚎花,要比列表提取數(shù)據(jù)高很多寸痢。