1. 程式人生 > >python基礎資料型別:dict(字典)和近期知識點總結__005

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'>