1. 程式人生 > >python全棧_011_Python3基本資料型別--字典

python全棧_011_Python3基本資料型別--字典

1:什麼是字典?:

  dict,以{} 來表示,使用逗號來隔開,內部元素使用key:value的形式來儲存資料,key必須是不可變的資料型別,value可以是任何型別的資料型別。
  已知不可變的資料型別:int,str,bool,tuple
  可變的資料型別: list,dict,set
  語法:
    {key1:value1,key2:value2,key3:value1.......}
    (注意:key必須是不可變資料型別)

# 合法
dic = {1234: 789, 'jj': '林俊杰', True: 300, 'jay': '周杰倫', (1,2,3): 'hello
'} # 這樣是可以的 print(dic[1234]) print(dic['jj']) print(dic[True]) print(dic[(1,2,3)]) # 不合法的 # dic = {1234: 456,[1,2]: 'list'} # list 是可變的,不能作為key;TypeError: unhashable type: 'list' #dic = {1234: 456,{1:2}: 'dict'} # dict 是可變的,不能作為key;TypeError: unhashable type: 'dict' dic = {1234: 456,{1,2}: 'set
'} # set 是可變的,不能作為key;TypeError: unhashable type: 'set'

2:字典的增刪改查:

2.1:增加

dic = {}  # 或者 dic = dict()
# 1: 直接用key 往裡面存資料即可,
#    如果不存在key值就新增,如果存在就更新key對應的值;
dic['劉德華'] = '馬桶'  #  直接用key 往裡面存資料即可
dic['王寶強'] = '天下無賊'
print(dic)   #  輸出  {'劉德華': '馬桶', '王寶強': '天下無賊'}
dic['王寶強'] = '士兵突擊'  # 如果key值存在,那麼會替換掉原來的value
print(dic) # 輸出 {'劉德華': '馬桶', '王寶強': '士兵突擊'} # 2:setdefault(),如果不存在就新增,返回value值;如存在就不做增加處理,返回原來的value值 value = dic.setdefault('黃秋生', '頭文字D') print(value) # 頭文字D print(dic) # {'劉德華': '馬桶', '王寶強': '士兵突擊', '黃秋生': '頭文字D'} value = dic.setdefault('黃秋生', '無間道') # 如果存在了key,不會執行增加操作, print(value) # 頭文字D print(dic) # {'劉德華': '馬桶', '王寶強': '士兵突擊', '黃秋生': '頭文字D'}

2.2:刪除

# 1: pop,指定 key值刪除
# dic.pop("a",'無key預設返回值') # pop根據key刪除鍵值對,並返回對應的值,如果沒有key則返回預設返回值
dic = {"黃日華": "天龍八部", "蘇有朋": "倚天屠龍記", "王寶強": "天下無賊" }
value = dic.pop('王寶強')  # key存在,並返回key對應的value
print(value)  # 天下無賊
print(dic)   # {'黃日華': '天龍八部', '蘇有朋': '倚天屠龍記'}

dic = {"黃日華": "天龍八部", "蘇有朋": "倚天屠龍記", "王寶強": "天下無賊" }
# dic.pop('劉德華')  # key值不存在,這樣刪除會報錯, KeyError: '劉德華'
# 刪除時指定預設的返回值
value = dic.pop('劉德華',None) #  這樣刪除不會報錯
print(value)  # None
print(dic)    # {'黃日華': '天龍八部', '蘇有朋': '倚天屠龍記', '王寶強': '天下無賊'}

# 2: popitem()  隨機刪除
dic = {"黃日華": "天龍八部", "蘇有朋": "倚天屠龍記", "王寶強": "天下無賊" }
dic.popitem()      # 隨機刪除
print(dic)

#  3: del,key值需要存在,不然會報錯
dic = {"黃日華": "天龍八部", "蘇有朋": "倚天屠龍記", "王寶強": "天下無賊" }
del dic['蘇有朋']    # 刪除存在的key值,
print(dic)
#del dic['蘇有朋']    #  刪除不存在的key,報錯, KeyError: '蘇有朋'
#print(dic)

# 4:clear() 清空字典
dic = {"黃日華": "天龍八部", "蘇有朋": "倚天屠龍記", "王寶強": "天下無賊" }
dic.clear()   # 清空字典
print(dic)

2.3:修改

# 更新(修改):
dic = {"黃日華": "天龍八部", "蘇有朋": "倚天屠龍記", "劉德華": "馬桶", "王寶強": "天下無賊" }
dic['劉德華'] = '無間道' # key不存在就新增,key存在就更新
dic2 = {'劉能': '大陽哥', '王寶強': '士兵突擊'}
dic.update(dic2)  # 將dic2所有的鍵值對覆蓋新增(相同的覆蓋,沒有的新增)到dic中
print(dic)
print(dic2)

2.4:查詢(訪問)

# 查詢
dic = {'黃日華': '天龍八部', '蘇有朋': '倚天屠龍記', '劉德華': '無間道', '王寶強': '士兵突擊', '劉能': '大陽哥'}
#1:最直觀。直接用key
print(dic['蘇有朋'])   # 沒有key值會報錯
#print(dic['蘇有朋3'])  # KeyError: '蘇有朋3'

#2:get方法,不存在返回None
print(dic.get('黃日華'))
print(dic.get('黃日華2'))  # 不存在返回 None
print(dic.get('黃日華3', 'haha不存在'))  # 第二個引數,不存在的時候,預設的返回值

2.5:判斷某個key是否存在

dic = {'黃日華': '天龍八部', '蘇有朋': '倚天屠龍記', '劉德華': '無間道', '王寶強': '士兵突擊', '劉能': '大陽哥'}

# 1:使用get方法
if dic.get('黃日華1') == None:
    print('黃日華1 不存在')
else:
    print('黃日華1 存在')

# 2:
if '黃日華2' in dic:
    print('黃日華2 存在')
else:
    print('黃日華2 不存在')

if  '黃日華3' in dic.keys():
    print('黃日華3 存在')
else:
    print('黃日華3 不存在')

3:字典的相關(遍歷):

dic = {'黃日華': '天龍八部', '蘇有朋': '倚天屠龍記'}

# 對字典的遍歷
print('-1-keys:' + '-'*30)
print(dic.keys())  # dict_keys(['黃日華', '蘇有朋'])  像列表,但不是列表
# 遍歷key,並通過key訪問value
for key in dic.keys():
    print(key, dic[key])

print('-2-values:' + '-'*30)
print(dic.values())
# 遍歷value
for value in dic.values():
    print(value)

print('-3-items:' + '-'*30)
# 也可以遍歷字典
print(dic.items())  # 拿到的是 (key,value)元組
for item in dic.items():
    print(item,type(item))   # item 為元組
    print(item[0], item[1])  # 通過下標訪問元組 item[0] 為key值,item[1]為value值


# 解構,解包
a, b = (10, 20)  # 解構,解包,要求前面變數的個數,與後面解包的個數一致
print(a,b)
a, b = [30, 40]  # 解構,解包 ,這樣也是可以的
print(a,b)

for item in dic.items():
    k, v = item # item 是元組,進行解包
    print(k, v)

# 可以直接使用下面的方式:
for key, value in dic.items():  # 當需要遍歷字典,在操作中涉及到key和value的時候
    print(key, value)


#  字典本身是一個可迭代物件,可以直接進行for迴圈
dic = {'黃日華': '天龍八部', '蘇有朋': '倚天屠龍記'}
# 只需要遍歷key的時候,使用這種方式
for key in dic:  # 拿到的是Key,  dic.keys()的結果一樣
    print(key)

 

4:字典的巢狀:

wf = {
    'name': '汪峰',
    'age': 44,
    '成名曲': '春天裡',
    'wife': {
        'name': '章子怡',
        'age': 39,
        '工作': '演員'
    },
    'children': [
        {'num': '001', 'name': '汪1', 'hobby': '唱歌'},
        {'num': '002', 'name': '汪2', 'hobby': '演戲'}
    ]

}

print(wf)
# wf 第二個孩子的愛好 ?
print(wf['children'][1]['hobby'])  #  輸出 演戲
# wf 妻子的工作 ?
print(wf['wife']['工作'])  # 輸出 演員
# wf 的老婆 老了10歲 ?
wf['wife']['age'] = wf['wife']['age'] + 10
print(wf)

 

5:字典內建函式&方法:

  Python字典包含了以下內建函式:

序號 函式及描述
1 cmp(dict1, dict2)
比較兩個字典元素。
2 len(dict)
計算字典元素個數,即鍵的總數。
3 str(dict)
輸出字典可列印的字串表示。
4 type(variable)
返回輸入的變數型別,如果變數是字典就返回字典型別。

  Python字典包含了以下內建方法:

序號 函式及描述
1 dict.clear()
刪除字典內所有元素
2 dict.copy()
返回一個字典的淺複製
3 dict.fromkeys(seq[, val])
建立一個新字典,以序列 seq 中元素做字典的鍵,val 為字典所有鍵對應的初始值
4 dict.get(key, default=None)
返回指定鍵的值,如果值不在字典中返回default值
5 dict.has_key(key)
如果鍵在字典dict裡返回true,否則返回false
6 dict.items()
以列表返回可遍歷的(鍵, 值) 元組陣列
7 dict.keys()
以列表返回一個字典所有的鍵
8 dict.setdefault(key, default=None)
和get()類似, 但如果鍵不存在於字典中,將會新增鍵並將值設為default
9 dict.update(dict2)
把字典dict2的鍵/值對更新到dict裡
10 dict.values()
以列表返回字典中的所有值
11 pop(key[,default])
刪除字典給定鍵 key 所對應的值,返回值為被刪除的值。key值必須給出。 否則,返回default值。
12 popitem()
隨機返回並刪除字典中的一對鍵和值。

 

6:for迴圈:

  for迴圈:使用者按照順序迴圈可迭代物件的內容。

s = 'HelloWorld'
print(s)
for i in s:
    print(i,end=',')

print('')
lst = [1,3,4,'hi']
for el in lst:
    print(el,end= ',')

print('')
tu = (1,4,'中國',False)
for el in tu:
    print(el,end=',')

print('')
dic = {'黃日華': '天龍八部', '蘇有朋': '倚天屠龍記'}
for k,v in dic.items():
    print(k,v)

6:enumerate:列舉:

  enumerate:列舉,對於一個可迭代的(iterable)/可遍歷的物件(如列表、字串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值
# enumerate:列舉,對於一個可迭代的(iterable)/可遍歷的物件(如列表、字串),
# enumerate將其組成一個索引序列,利用它可以同時獲得索引和值
# enumerate(sequence, [start=0])

s = 'HelloWorld'
print(s)
for index,value in enumerate(s):
    print(index,value)

print('')
lst = [1,3,4,'hi']
for index,el in enumerate(lst):
    print(index,el)

print('')
tu = (1,4,'中國',False)
for index,el in enumerate(tu):
    print(index,el)