python學習之數據類型(dic)


3.8 字典

3.8.1 字典的介紹

​ 字典(dict)是python中唯一的一個映射類型,它是以{ }括起來的鍵值對組成,在dict中key是唯一的。在保存的時候,根據key來計算出一個內存地址,然后將key-value保存在這個地址中,這種算法被稱為hash算法。所以,在dict中存儲的key-value中的key必須是可hash的,可以改變的都是不可哈希的,那么可哈希就意味着不可變。這個是為了能准確的計算內存地址而規定的。已知的可哈希(不可變)的數據類型: int, str, tuple, bool;不可哈希(可變)的數據類型: list, dict, set

​ 字典能夠存儲大量的數據,比列表還要大;字典查找數值更方便;對數據可以進行關聯;字典比較消耗內存

​ 有明確對應關系時,推薦使用字典

語法 :
{key1: value1, key2: value2....}
注意: key必須是不可變(可哈希)的,value沒有要求。可以保存任意類型的數據,因為key的存在,字典的查詢效率非常的高。

dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帥哥', '美女'], (1, 2, 3): '麻花藤'}
#合法
print(dic[123])
print(dic[True])
print(dic['id'])
print(dic['stu'])
print(dic[(1, 2, 3)])

#不合法
dic = {{1: 2}: "哈哈哈"} # dict是可變的. 不能作為key
dic = {[1, 2, 3]: '周傑倫'} # list是可變的. 不不能作為key
dic = {{1, 2, 3}: '呵呵呵'} # set是可變的, 不能作為key

​ dict保存的數據不是按照我們添加進去的順序保存的,是按照hash表的順序保存的,而hash表是不連續的,所以不能進行切片工作,它只能通過key來獲取dict中的數據

3.8.2 字典的相關操作

1.增加

常規:dic[key] = value

#增加
dic = {}
dic['name'] = '周潤發' # 如果dict中沒有出現這個key, 就會新增一個key-value的組合進dict
dic['age'] = 18
print(dic)

不可替換:dic.setdefault('Key','value')

如果key已經在字典中出現過了,那么這條命令就不進行增加操作。

# 如果dict中沒有出現過這個key-value. 可以通過setdefault設置默認值
dic.setdefault('蓋倫') # 也可以往里面設置值
dic.setdefault("蓋倫", "德瑪西亞") # 如果dict中已經存在了,那么setdefault將不會起作用
print(dic)

2.刪除

dic.popitem() #隨即刪除

dic.pop('Key') #定向刪除,返回被刪除的value

del dic[Key] #del刪除指定的鍵值對

dic.clear() #清空,得到一個空的字典

注意:當字典在迭代過程中,是不能進行刪除或添加操作,因為迭代是無序的。如果要進行刪除操作,把要刪除的元素暫時先保存在⼀個list中,然后循環list,對dic進行刪除操作。

3.修改和查詢

修改

dic['Key'] = 新的value key再字典中存在,就是修改;key不在字典時,就添加

dic.update(dic2) #dic2中的Key與dic里的key一致時,替換value;如果dic2中的key不存在dic中,則在dic中新增該鍵值對;如果dic中有dic2沒有的Key則該鍵值對保持不變。

查詢

print( dic[key] ) #key不存在時會報錯;可以使用加減乘除運算

dic[key] += 5

print( dic.get(key,key不存在時返回的內容) #key不存在時返回None,該返回值可自定義;不能對其進行賦值

setdefault('key') ##1.新增(先看有沒有Key,如果有直接進行查詢;如果沒有,則新增然后查詢返回value) 2.根據key把value值返回

4.遍歷

字典的遍歷--keys()

​ 輸出的是一個dict_keys類型的列表,可以進行for循環,但是不能使用索引。

### 字典的遍歷
dic = {'蓋倫':'德瑪西亞','戴安娜':'月光女神','猴哥':'齊天大聖'}
print(dic.keys())   #高仿列表,類型是dict_keys
for key in dic.keys():
    print(key)  #拿到key
    print(dic[key])   #拿到value,實現對value的遍歷

字典的遍歷--values()

輸出的也是一個dict_keys類型的列表,可以進行for循環,但是不能使用索引。

注意:通過key可以找到value但是通過value找不到key!!

dic = {'蓋倫':'德瑪西亞','戴安娜':'月光女神','猴哥':'齊天大聖'}
print(dic.values())   #通過value是拿不到Key的
for value in dic.values():  #只能遍歷value
    print(value)

字典的遍歷--鍵值對items()

只有元組的列表,元組里邊是鍵值對

[(key1,value1),(key2,value2),(key3,value3)...]

dic = {'蓋倫':'德瑪西亞','戴安娜':'月光女神','猴哥':'齊天大聖'}
print(dic.items())  #只有元組的列表,元組里邊是鍵值對信息
for item in dic.items():
    print(item)  #輸出的是元組
    print(item[0],item[1])

字典的遍歷--腦路清奇版

首先,介紹一個解包小知識,解包時前邊變量的個數必須與后邊解包的個數必須一致。

a,b = (10,20)  #解構,解包,元組、列表都具有該功能
print(a)  
print(b)
###前邊變量的個數必須與后邊解包的個數必須一致
a,b,c = '你好啊'
print(a,c)  #輸出   你 啊

實現:當需要遍歷字典,在操作中涉及到key和value的時候,直接版是最佳選擇

#含蓄版
dic = {'蓋倫':'德瑪西亞','戴安娜':'月光女神','猴哥':'齊天大聖'}
for item in dic.items():
    k,v = item
    print(k)
    print(v)
#直接版
dic = {'蓋倫':'德瑪西亞','戴安娜':'月光女神','猴哥':'齊天大聖'}
for k,v in dic.items():
    print(k)
    print(v)

字典的遍歷--key迭代版

因為字典本身就是一個可迭代的對象,可以直接進行for循環

#先看一下如果直接對字典進行迭代的話會是什么情況
dic = {'蓋倫':'德瑪西亞','戴安娜':'月光女神','猴哥':'齊天大聖'}
for el in dic:
    print(el)  #直接輸出的只有Key,那么是不是可以用key把value給印出來呢?
    print(dic[el])  #答案是可以的

5.字典的嵌套

在寫字典嵌套時,一點更要注意元素與元素之間不要忘記加逗號。

dic = {
    'name' : '蓋倫',
    'age'  : 24,
    'slogan' :'德瑪西亞',
    'family': {
            '皇子' : '嘉文四世',
            '總管' : '趙信',
            '女警' : {
                'name' : '凱特琳',
                'age'  : 23 ,
                'slogan':'我,miss,怎么可能'
                    }
                } ,
    'equipment': [

        {'num1':'黑切','use':'kill','gank':'Yes'},
        {'num2':'日炎','use':'堆肉','gank':'No'}
                    ]
        }
print(dic['equipment'][1]['gank'])  #查看蓋倫第二個裝備是否適合gank
dic['family']['總管'] = dic['family']['總管'] + '總管'  #修改德邦的信息
print(dic['family']['總管'] )

6. enumerate(dict,start)枚舉

​ 給要迭代的對象加一個序號;

​ 把字典的key與數字結合起來,輸出一個元組;start默認從0開始,可以修改成任意值

dic = {'蓋倫':'德瑪西亞','戴安娜':'月光女神','猴哥':'齊天大聖'}
for i,k in enumerate(dic,1):
    print(i,k)
#輸出
1 蓋倫
2 戴安娜
3 猴哥

字符串和列表中也可以使用。

7. fromkeys()

formkeys()的作用是幫助我們通過list創建字典,它是一種類的方法,它不直接對應對象,即能創建新的字典,不能更改已創建的字典。

語法:dic = fromkeys(keys,values),這里的key和value都是列表

keys用的是同一個value,如下:

lis = ['德瑪西亞之力','皇子','趙信','女警']
lis1 = ['lol','英雄聯盟']
d = dict.fromkeys(lis1,lis)
print(d)
print(id('lol'),id('英雄聯盟'))#查看兩個key的ID
#輸出
{'lol': ['德瑪西亞之力', '皇子', '趙信', '女警'], '英雄聯盟': ['德瑪西亞之力', '皇子', '趙信', '女警']}
2248951452984 2248950434288  #兩個key的ID相同

看大坑來了:當對一個key的value進行修改時,會直接同步給其他的key。

​ 當對'lol'的value進行修改時,因為與'德瑪西亞'共用一組value,因此會直接影響'德瑪西亞',如下:

d.get('lol').append('李菁')
print(d)
#輸出
{'lol': ['德瑪西亞之力', '皇子', '趙信', '女警', '李菁'], '英雄聯盟': ['德瑪西亞之力', '皇子', '趙信', '女警', '李菁']}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM