天天看點

建立 dict 的幾種方法學習小結1. 直接指派建立2. 使用 dict 關鍵字建立3. 通過fromkeys() 方法建立字典4. 使用“生成式”建立字典小結

建立 dict 的幾種方法學習小結

dict(全稱 dictionary,可以翻譯為“字典”),其使用“鍵-值(key-value)”對兒的方式存儲多項資料,是一個無序可變的集合。

建立 dict 的幾種方法學習小結1. 直接指派建立2. 使用 dict 關鍵字建立3. 通過fromkeys() 方法建立字典4. 使用“生成式”建立字典小結

dict 的建立可以有多種方式:

1. 通過直接指派方式建立

  • 建立空字典
  • 建立指定内容的字典

2. 使用 dict 關鍵字建立

  • 建立空字典
  • 通過傳入關鍵字(**kwargs)方式建立
  • 通過傳入 映射(mapping)對象建立
  • 通過傳入可疊代(iterable)對象建立

3. 使用 fromkeys() 方法建立并初始化字典

4. 使用 “生成式” 方法建立字典

1. 直接指派建立

# 建立一個空白的字典
c1 = {}

# 建立一個指定内容的字典
c2 = {'name': 'Jonah', 'age': '14'}
           

2. 使用 dict 關鍵字建立

首先在 PyCharm 中打開 dict 類的說明(簡單打開方法為:輸入 dict 後,按下鍵盤 Ctrl 鍵,同時滑鼠移動到 該關鍵字上方,待其樣式變為超鍊後點選即可)。自動打開 builtins.py 檔案的 dict 類定義位置,由于Python 的核心代碼為C語言編寫,此處是看不到真正源碼的,但是我們可以看到其文檔描述資訊。

建立 dict 類的對象可以通過文檔描述中的四種方式實作:

  • dict(),建立空白的字典。
  • dict(**kwargs),通過關鍵字參數方式建立。
  • dict(mapping),通過傳入映射類型對象方式建立。
  • dict(iterable),通過傳入可疊代對象方式建立。

檔案:builtins.py

class dict(object):
  def __init__(self, seq=None, **kwargs): # known special case of dict.__init__
    """
    dict() -> new empty dictionary
    dict(mapping) -> new dictionary initialized from a mapping object's
        (key, value) pairs
    dict(iterable) -> new dictionary initialized as if via:
        d = {}
        for k, v in iterable:
            d[k] = v
    dict(**kwargs) -> new dictionary initialized with the name=value pairs
        in the keyword argument list.  For example:  dict(one=1, two=2)
    # (copied from class doc)
    """
    pass
           

另外,輸入dict()後,按下 Ctrl鍵後,滑鼠移動到此處并懸停後也會彈出相關提示資訊。

建立 dict 的幾種方法學習小結1. 直接指派建立2. 使用 dict 關鍵字建立3. 通過fromkeys() 方法建立字典4. 使用“生成式”建立字典小結

(1) 建立空白的 dict

c1 = dict()
print(c1)

----------
輸出: {}
           

(2) 通過關鍵字參數方式建立

分别把每個傳入參數的名稱作為字典的“鍵”,傳入參數的值作為字典的“值”使用。

c1 = dict(name='Jonah', age=14)
print(c1)

-----------------------------
輸出:{'name': 'Jonah', 'age': 14}
           

(3) 通過傳入可疊代對象方式建立

我們知道,如清單、元組、字元串等都屬于可疊代對象,可疊代對象的特點是其實作了__iter__方法,在使用 dict 關鍵字建立字典的時候,也可以傳入一個可疊代的對象來實作。但是此對象中的每個元素都要求是包含兩個對象的元組方式。

如: [('name', 'Jonah'), ('age', '14')]

或: {('name', 'Jonah'), ('age', '14')}

# 建立一個清單(list)類型的可疊代對象
it1 = [('name', 'Jonah'), ('age', '14')]

# 方法1:通過循環指派的方式生成字典
dic1 = {}
for k, v in it1:
    dic1[k] = v
print(dic1)

# 方法2:直接通過可疊代的對象生成字典
dic2 = dict(it1)
print(dic2)

------------------------
輸出結果相同,二者是等價的,隻是實作方法不同而已:
{'name': 'Jonah', 'age': '14'}
{'name': 'Jonah', 'age': '14'}
           

(4) 通過傳入映射對象方式建立

通過“名稱”來引用對應“值”的資料結構稱為映射(mapping),dict 本身就是一種映射結構。是以可以直接将一個“字典”當作參數傳入給另一個“字典”。

将一個“字典(dict)”以參數的方式傳入另一個“字典(dict)”

# 先定義一個 dict1 備用
dic1 = {'name': 'Jonah', 'age': '14'}

# 1. 建立一個字典 dict,其參數中傳入前面備用的 dic1
dic2 = dict(dic1)
print(dic2)

# 2. 建立一個字典 dict,傳入:dic1 + 關鍵字參數
dic3 = dict(dic1, gender='男')
print(dic3)

---------------------------------
輸出:
{'name': 'Jonah', 'age': '14'}
{'name': 'Jonah', 'age': '14', 'gender': '男'}
           

另外,Python 中還提供了 map 和 zip 相關的對象方法,以生成 mapping 對象,這類的 mapping 對象也可以當參數傳入并生成 dict 對象。

  • map():根據提供的函數對指定序列做映射。
  • zip():将可疊代的對象作為參數,将其中對應的元素打包成多個元組,然後傳回由這些元組組成的清單。

通過 map 方式建立字典

# 先定義一個函數,用于組合成一個“鍵值對”的映射關系
def f(k, v):
    return (k, v)

# 定義兩個可疊代對象,分别提供 “鍵值對” 裡面的 “鍵” 和 “值”
lst = list('ABCDE')
num = range(1, 6)

# map方法,循環周遊兩個可疊代對象,經過 f() 函數處理後,生成映射關系對象
m = map(f, lst, num)

# 将映射對象當作參數,生成字典
d = dict(m)
print(d)

====================
輸出:{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
           

通過 zip 方式建立

# 定義兩個可疊代對象
lst = list('ABCDE')
num = range(1, 6)

# 将二者一一對應,組成元組清單(存儲了映射關系)
m = zip(lst,num)

# 建立字典
d = dict(m)
print(d)

====================
輸出:{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
           

3. 通過fromkeys() 方法建立字典

fromkeys() 函數用于建立一個新字典,以第一個序列參數中的元素做字典的“鍵”,以第二個參數為字典所有鍵對應的初始“值”,相當于給字典中的所有鍵一個相同的初始值。

d1 = dict.fromkeys('ABCD', 0)
print(d1)

--------------------
輸出:{'A': 0, 'B': 0, 'C': 0, 'D': 0}
           

4. 使用“生成式”建立字典

在 Python 中,通過“生成式(comprehensions)”對可疊代對象進行循環處理,可以簡單快速的生成一個新的字典。 其文法格式如下:

{ 鍵_表達式 : 值_表達式 for 表達式 in 可疊代對象 }

d1 = {i: chr(i) for i in range(65, 69)}
print(d1)

------------------------
輸出:{65: 'A', 66: 'B', 67: 'C', 68: 'D'}
           

小結

将以上各種方式進行整理如下:

# 1. 直接指派
dict1 = {}


# 2. 直接指派
dict2 = {'name': 'Jonah', 'age': '14'}


# 3. dict() 方式
dict3 = dict()


# 4. dict(**kwargs) 方式
dict4 = dict(name='Jonah', age=14)


# 5. dict(iterable) 方式
lst = [('name', 'Jonah'), ('age', '14')]
dict5 = dict(lst)


# 6. dict(mapping) - zip 方式
zp = zip('ABCD', range(1, 5))
dict6 = dict(zp)


# 7. dict(mapping) - map 方式
mp = map(lambda x, y: (x, y), 'ABCD', range(1, 5))
dict7 = dict(mp)


# 8. dict + kw 方式
d1 = {'name': 'Jonah'}
dict8 = dict(d1, age='14')


# 9. fromkeys 方式
dict9 = dict.fromkeys('ABCD', 0)


# 10. 生成式方式
dict10 = {i: chr(i) for i in range(65, 69)}