Python中的字典dict

字典是python中唯一的內置映射類型,其中的值不按順序排列,而是存儲在鍵下。鍵不可修改且不能重複的,所以其可能是數字、字符串或元組,而不可能是list。字典中鍵-值對被稱爲項(item),其語法如下:

{"Alice": 12, "Beth": 11, "Danny": 14}

1 函數dict

>>> items = [('name', 'Alice'), ('age', 12)]
>>> d = dict(items)
>>> d
{'name': 'Alice', 'age': 12}
>>> d = dict(name='Beth', age=11)
>>> d
{'name': 'Beth', 'age': 11}

2 基本操作

len(d):返回字典d中的(鍵值對數)項數。

d[k]:返回與鍵k相關聯的值。

d[k] = v:將v的值關聯到鍵k。

del d[k]:刪除鍵爲k的項。

k in d:檢查字典d是否包含鍵爲k的項。

# 一個簡單的數據庫
# 一個將人名用作鍵的字典。每個人都用一個字典表示。
# 字典包含鍵‘phone’和‘addr’,它們分別與電話號碼和地址相關聯
people = {

    "Alice": {
        "phone": "2341",
        "addr": "Foo drive 23"
    },

    "Beth": {
        "phone": "9102",
        "addr": "Bar street 42"
    },

    "Cecil": {
        "phone": "3158",
        "addr": "Baz avenue 90"
    }
}

# 電話號碼和地址的描述性標籤,供打印輸出使用
labels = {
    "phone": "phone number",
    "addr": "address"
}

name = input("Name:")

# 要查找電話號碼還是地址?
request = input("Phone number (p) or address (a)? ")

# 使用正確的鍵:
if request == "p":
    key = "phone"

if request == "a":
    key = "addr"

# 僅當名字是字典包含的鍵時纔打印信息
if name in people:
    print("{}'s {} is {}".format(name, labels[key], people[name][key]))

運行結果:

Name:Beth
Phone number (p) or address (a)? p
Beth's phone number is 9102

3 字典方法

    3.1 clear

清除所有的字典項,沒有返回值。

d = {}
d["name"] = "Gumby"
d["age"] = 42
print(d)
d.clear()
print(d)
{'name': 'Gumby', 'age': 42}
{}

    3.2 copy

返回一個新字典,這個方法是淺複製。當替換副本的值時,原件不受影響;然而,如果修改副本中的值,原件也會改變。因爲原件指向的也是被修改的值。

# 淺複製
x = {"username": "admin",  "machines": ["foo", "bar", "baz"]}
y = x.copy()
y["username"] = "mlh"
y["machines"].remove("bar")
print("y:", y)
print("x:", x)

 運行結果:

y: {'username': 'mlh', 'machines': ['foo', 'baz']}
x: {'username': 'admin', 'machines': ['foo', 'baz']}

 爲解決這個問題,可以使用模塊copy中的deepcopy實現深複製,將同時複製值及其包含的所有值。

# 深複製
from copy import deepcopy
d = {}
d["names"] = ["Alfred", "Bertrand"]
c = d.copy()
dc = deepcopy(d)
d["names"].append("Clive")
print("c:", c)
print("dc:", dc)

 運行結果:

c: {'names': ['Alfred', 'Bertrand', 'Clive']}
dc: {'names': ['Alfred', 'Bertrand']}

    3.3 fromkeys

創建一個新字典,其中包含指定的鍵,且默認每個鍵對應的值都是None。

d = dict.fromkeys(["name", "age"])
print(d)
d = dict.fromkeys(["name", "age"], "(unknown)")
print(d)

運行結果:

{'name': None, 'age': None}
{'name': '(unknown)', 'age': '(unknown)'}

    3.4 get

通常,使用[鍵]的方式訪問字典中沒有的項,將會引發錯誤。而用get方法來訪問不存在的鍵時,不會引發異常,而是返回None,若指定默認值,這樣將返回指定的默認值而不是None。

x = {"username": "admin",  "machines": ["foo", "bar", "baz"]}
print(x.get("username", "N/A"))
print(x.get("addr"))
print(x.get("addr", "N/A"))

運行結果:

admin
None
N/A

    3.5 items

返回一個包含所有字典項的列表,其中每個元素都爲(key, value)的形式。該列表屬於特殊類型字典視圖,這只是底層字典的反映,而不是複製。

d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
it = d.items()
print(it)
print(len(it))
print(("spam", 0) in it)
d["spam"] = 1
print(("spam", 0) in it)

運行結果:

dict_items([('title', 'Python Web Site'), ('url', 'http://www.python.org'), ('spam', 0)])
3
True
False

    3.6 keys

返回一個字典試圖,其中包含指定字典中的鍵。

>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> d.keys()
dict_keys(['title', 'url', 'spam'])

    3.7 pop

獲取與指定鍵相關聯的值,並將該鍵-值對從字典中刪除。

>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> d
{'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.pop("title")
Python Web Site
>>> d
{'url': 'http://www.python.org', 'spam': 0}

     3.8 popitem

隨機的彈出一個字典項,因爲字典項的順序是不確定的,沒有“最後一個元素”的概念。

>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> d
{'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.popitem()
('spam', 0)
>>> d
{'title': 'Python Web Site', 'url': 'http://www.python.org'}

    3.9 updata

使用一個字典中的項來更新另一個字典。

>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> d
{'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> x = {"title": "Python Language Website"}
>>> d.update(x)
>>> d
{'title': 'Python Language Website', 'url': 'http://www.python.org', 'spam': 0}

    3.10 values

返回一個由字典中的值組成的字典試圖。

>>> x = {"username": "admin",  "machines": ["foo", "bar", "baz"]}
>>> x.values()
dict_values(['admin', ['foo', 'bar', 'baz']])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章