python基礎資料型別:dict(字典)和近期知識點總結__005
字典dict
1、資料型別劃分:可變資料型別,不可變資料型別
(1)不可變資料型別(可雜湊):str、int、bool、元組
(2)可變資料型別(不可雜湊):dict、list、set
2、dict:
key必須是不可變資料型別:可雜湊,鍵一般是唯一的,如果重複,會替換前面的,值不需要唯一
value可以是任意資料型別
3、dict優點:
(1)二分查詢去查詢
(2)儲存大量關係型資料
特點:無序的(即沒有索引,python3.5之前沒有)
4、字典是另一種可變容器模型,且儲存任意型別的物件
字典的每個鍵值key==>value對用冒號:分割,每個鍵值對之間用,逗號分割,整個字典包括在花括號{}中,格式如下:
d = {key1 : value1, key2 : value2 }
5、訪問字典中的值(檢視)
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140} # 檢視字典中所有的key,以列表形式展示 print(dict_check.keys()) # dict_keys(['age', 'name', 'heigh', 'weight']) # 檢視字典中所有的value,以列表形式展示 print(dict_check.values()) # dict_values([18, '江河', 170, 140]) # 通過items()查的是鍵和值,返回的是列表,鍵和值由元組組成 print(dict_check.items()) # dict_items([('age', 18), ('name', '江河'), ('heigh', 170), ('weight', 140)]) # 檢視某一個key的值,如果key不存在報錯 value = dict_check['name'] print(value) # 使用get()方法檢視值,key不存在,預設返回None value = dict_check.get('cs') print(value) # None # for迴圈檢視字典中所有的鍵值 dict_check = {'age':18,'name':'江河','heigh':170,'weight':140} for key,value in dict_check.items(): print(key,value)
6、字典中鍵值對的增加操作
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140} # 如果新增的字典中無相同的鍵,則新增新的鍵值對 dict_check['address'] = '北京' print(dict_check) # 如果新增的字典中有相同的鍵,則覆蓋之前的值 dict_check['age'] = 20 print(dict_check) # setdefault()方法由鍵值對,不做任何改變,沒有才新增 dict_check.setdefault('name','jh') print(dict_check) dict_check.setdefault('come','來') print(dict_check) dict_check.setdefault('hand') # 不新增值,預設是None,有返回值為預設值None print(dict_check)
7、字典中鍵值對的刪除操作
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
# del 刪除鍵值和整個字典
del dict_check['age']
print(dict_check)
dict_check.clear() # 清空字典
print(dict_check)
del dict_check # 刪除字典
print(dict_check)
8、字典中鍵值對的修改操作
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
dict_check['age'] = 19
print(dict_check)
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
dict_check_1 = {'age_1':10}
dict_check_1.update(dict_check) # 更新字典
print(dict_check)
print(dict_check_1)
#面試題:用一行程式碼互換a、b的值
a = 1
b = 2
a,b = b,a
print(a,b)
===========================字典巢狀============================
8、例子:
dic = {
'name': ['alex','wusir','taibai'],
'py9': {
'time': '1213',
'learn_money': 19800,
'addr': 'CBD',
},
'age': 21
}
dic['age'] = 56
dic['name'].append('jianghe')
dic['name'][2] = dic['name'][2].upper()
print(dic)
# {'name': ['alex', 'wusir', 'TAIBAI', 'jianghe'], 'py9': {'time': '1213', 'learn_money': 19800, 'addr': 'CBD'}, 'age': 56}
============================作業==========================
1、有如下值li= [11,22,33,44,55,66,77,88,99,90],將所有大於 66 的值儲存至字典的第一個key中, 將小於 66 的值儲存至第二個key的值中。即: {'k1': 大於66的所有值列表, 'k2': 小於66的所有值列表}
li= [11,22,33,44,55,66,77,88,99,90]
dic = {}
dic_key1 = []
dic_key2 = []
for i in li:
if i>66:
dic_key1.append(i)
else:
dic_key2.append(i)
dic['k1'] = dic_key1
dic['k2'] = dic_key2
print(dic)
# {'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55, 66]}
2、
購物選擇
(1)輸出商品列表,使用者輸入序號,顯示使用者選中的商品
商品 li = ["手機", "電腦", '滑鼠墊', '遊艇']
要求:<1>:頁面顯示 序號 + 商品名稱,如:
**手機
**電腦
<2>: 使用者輸入選擇的商品序號,然後列印商品名稱
<3>:如果使用者輸入的商品序號有誤,則提示輸入有誤,並重新輸入。
<4>:使用者輸入Q或者q,退出程式。
while 1:
li = ["手機", "電腦", '滑鼠墊', '遊艇']
for i in li:
li_1 = li.index(i) + 1 # 求索引index()
print(('{li_1}\t\t{i}'.format(li_1=li_1, i=i))) # 格式化輸出
goods_input = input('請輸入序號:')
if goods_input.isdigit():
goods_input = int(goods_input)
if goods_input < len(li) and goods_input>0:
print(li[goods_input-1])
else:
print('請輸入有效數字')
elif goods_input.lower() == 'q':
break
else:
print('請輸入數字:')
3、購物車(全部)
li = [{'name':'蘋果','price':10},
{'name':'香蕉','price':20},
{'name':'橘子','price':30},]
shopping_car = {}
print('歡迎光臨!')
money = input('檢視是否有錢?')
if money.isdigit() and int(money)>0:
while 1:
for i,element in enumerate(li):
print('序號{},商品{},價格{}'.format(i,element['name'],element['price']))
choose = input('請輸入您要購買的商品序號:')
if choose.isdigit() and int(choose)<len(li):
num = input('請輸入你要購買的商品數量:')
if num.isdigit() and 1<int(num):
if li[int(choose)]['price']*int(num) <=int(money):
money = int(money) -int(li[int(choose)]['price'])*int(num)
if li[int(choose)]['price'] in shopping_car:
shopping_car[li[int(choose)]['name']] = shopping_car[li[int(choose)]['name']] + int(num)
else:
shopping_car[li[int(choose)]['name']] = int(num)
print('購物車中商品有{},您的餘額為{}'.format(shopping_car,money))
else:
print('沒錢,來幹嘛!')
break
else:
print('非序號,請重新輸入序號:')
else:
print('非數字,請輸入正確的數字:')
===========================小知識點總結========================================
1、
(1)python2:預設編碼方式是ASCII碼;python3:預設編碼方式utf-8
(2)ASCII:是由字母、數字和特殊字元構成,一個位元組=8位bit(每個字母、數字或特殊字元為一個位元組)
unicode:萬國碼,一開始是16位,兩個位元組構成
現狀:32位,4個位元組構成(由字母、數字、特殊字元和中文構成)每個字元都是4個位元組
utf-8:unicode的升級版,至少由一個位元組構成
字母、數字、特殊字元為一個位元組
中文24位,每個中文3個位元組
gbk:由ascii碼演變的,只有中國本土用
數字、字母、特殊字元為一個位元組
中文為2個位元組(window預設是gbk)
(3)python2的不同之處:
如:print('字串') 和 print '字串' 兩者都可以列印
xrange()是生成器,python3沒有
raw_input() # 使用者輸入
(4)python3:
print('字串') # 可以列印,其他方式錯誤
input() # 使用者輸入
2、
(1)= 是賦值;== 比較值是否相等; is 比較(比較的是記憶體地址)
方法:id(內容) 例子:如
li1 = [1,2,3]
li2 = li1
li3 = li2
print(id(li1),id(li2)) # 記憶體地址相等
print(li1 is li2) # True
3、編碼:
(1)ASCII碼:
A:00000010 8位 一個位元組
(2)unicode:
A:00000000 00000001 00000010 00000100 32位 四個位元組
中:00000000 00000001 00000010 00000110 32位 四個位元組
(3)utf-8
A : 00100000 8位 一個位元組
中: 00000001 00000010 00000110 24位 三個位元組
(4)gbk
A : 00000110 8位 一個位元組
中: 00000010 00000110 16位 兩個位元組
(注意:各個編碼之間的二進位制,是不能相互識別的,會產生亂碼
檔案的儲存、傳輸,不能用unicode(只能用utf-8、、gbk、gb2312、ascii等))
4、python3
(1)str 在記憶體中是用unicode編碼
(2)bytes型別
對於英文:
str:表現形式:s = 'alex'
編碼形式:010101010 unicode
bytes:表現形式:s = b'alex'
編碼形式:000101010 utf-8、gbk等
對於中文:
str:表現形式:s = '中國'
編碼形式:010101010 unicode
bytes:表現形式:s = b'x\e91\e91\e01\e21\e31\e32'
編碼形式:000101010 utf-8、gbk等
(3)例子:
# 英文
s = 'alex'
s1 = b'alex'
print(s,type(s)) # alex <class 'str'>
print(s1,type(s1)) # b'alex' <class 'bytes'>
# 中文
s = '中國'
print(s,type(s))
s1 = b'中國' # 正確的表現形式是:s1 =b'\xe4\xb8\xad\xe5\x9b\xbd'
print(s1,type(s1))
# File "E:/wj/test_project1/cs_python.py", line 69
# s1 = b'中國'
# ^
#SyntaxError: bytes can only contain ASCII literal characters.
(4)字串編碼轉換
encode編碼,如何將str--->bytes
字串英文:unicode轉換bytes型別
s1 = 'alex'
s11 =s1.encode('utf-8')
s12 = s1.encode('gbk')
print(s11,type(s11)) # b'alex' <class 'bytes'>
print(s12,type(s12)) # b'alex' <class 'bytes'>
字串中文:unicode轉換bytes型別
s1 = '中國'
s11 =s1.encode('utf-8')
s12 = s1.encode('gbk')
print(s11,type(s11)) # b'alex' <class 'bytes'>
print(s12,type(s12)) # b'alex' <class 'bytes'>
===============================基礎資料型別彙總================================
1、
(1)str字串補充:檢測字串是否只由空格組成。:str.isspace()
s = ' '
print(s.isspace()) # True
s1 = ''
print(s1.isspace()) # False
(2)list列表(條件刪除)
例子:lis = [11,22,33,44,55]刪除列表中奇數
j = 0
for i in lis:
if i%2 == 1:
del lis[lis.index(i)-j]
i += 1
print(lis)
lis = lis[1::2]
print(lis)
li1 = []
for i in lis:
if i%2 == 0:
li1.append(i)
lis = li1
print(lis)
(3)使用方法
dict.fromkeys(seq[, value]) # seq -- 字典鍵值列表。value -- 可選引數, 設定鍵序列(seq)的值。
字典 fromkeys() 函式用於建立一個新字典,以序列 seq 中元素做字典的鍵,value 為字典所有鍵對應的初始值。
dic = dict.fromkeys([1,2,3,4],'cs')
print(dic) # {1: 'cs', 2: 'cs', 3: 'cs', 4: 'cs'}
(4)通過字典dic查詢到鍵的值為列表,通過用列表中append()方法新增鍵值
dic = {1: [], 2: [], 3: [], 4: []}
print(dic)
dic[1].append('測試')
print(dic)
(5)去除鍵中含k的鍵值
dic = {'k1':'v1','k2':'v2','a3':'v3'}
# 第一種方法
dic = {'k1':'v1','k2':'v2','a3':'v3'}
dic1 = {}
for i in dic.keys():
if 'k' not in i:
dic1[i] = dic[i]
dic = dic1
print(dic)
# 第二種方法
dic = {'k1':'v1','k2':'v2','a3':'v3'}
li = []
for i in dic.keys():
if 'k' in i:
li.append(i)
for i in li:
del dic[i]
print(dic)
(6)轉換成bool值為False的型別
# 轉換成bool值為False的型別
print(bool([]))
print(bool(''))
print(bool(()))
print(bool({}))
print(bool(set()))
(7)元組:如果元組裡面只有一個元素且不加逗號,那此元素是什麼型別,就是什麼型別
例子:
print(type((1))) # <class 'int'>
print(type((1,))) # <class 'tuple'>
print(type((''))) # <class 'str'>
print(type(({}))) # <class 'dict'>