dict

Python 教學 9 – Python Mapping Type: dict

dict 是 Python 中的 mapping type,類似 js 中的 object,每一個 element 都由 key 和 value 組成。

1. 特性

  • 每一個 item 都由 key 和 value 組成
  • object 內不會有重複的 key
  • 如果新增的 key-value 已經有相同的 key 在 dict 內的話,新的 value 會蓋掉舊的

2. 宣告 dict

2.1 comma-separated list of key: value pairs within braces

可以用大括號宣告,每個 key-value pair 用 ‘:’ 來區隔

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}

print(type(my_dict))
<class 'dict'>
print(my_dict)
{'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}

2.2 Dict Comprehension

Comprehension 是 Python 中特殊的表示法,詳細介紹可以參考:Python Comprehension 語法 – List Comprehension, Set Comprehension, Dict Comprehension

Dict Comprehension 的語法:

{key: value for item in iterable (if condition)}

至於 iterable 的定義,可以參考這篇:Python Iterable Objects 介紹

my_dict = {x: x ** 2 for x in range(5)}
print(my_dict)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

my_dict = {x: x ** 2 for x in range(5) if x % 2 == 1}
print(my_dict)
{1: 1, 3: 9}

my_dict = {x + 3: x ** 2 for x in range(3)}
print(my_dict)
{3: 0, 4: 1, 5: 4}

2.3 type constructor: dict()

可以用 dict 的 type constructor 來宣告 dict object。

class dict(**kwargs)
class dict(mapping**kwargs)
class dict(iterable**kwargs)

使用 dict 的 type constructor 建立 dict object 的時候有幾個規則:

  • 如果沒有 positional argument,會建立空的 dict
  • 如果有 positional argument,且該 argument 是個 mapping object,那會建立一個新的一模一樣的 mapping object
  • 如果有 positional argument,且該 argument 不是 mapping object,那這個 argument 一定要是 iterable object,且這個 object 的每個 item 要剛好有兩個 object,第一個作為 key,第二個作為 value
  • 如果有 keyword argument,那 keyword argument 將作為 key-value pair 新增由 positional argument 建立的 dict object
延伸閱讀:
Python Iterable Objects 介紹
Python 中的 function arguments
# 沒有 positional argument
my_dict = dict()
print(my_dict)

# 有 positional argument,且該 argument 是個 mapping object
my_dict = dict({'name': 'Jimmy', 'age': 20, 'city': 'Taipei'})
print(my_dict)

# 有 positional argument,且該 argument 不是 mapping object,那這個 argument 一定要是 iterable object
my_info = [('name', 'Jimmy'), ('city', 'Taipei')]
print(dict(my_info))
{'name': 'Jimmy', 'city': 'Taipei'}

my_set = [{'name', 'Jimmy'}, {'city', 'Taipei'}]
print(dict(my_set))
{'Jimmy': 'name', 'city': 'Taipei'}

my_data = ({'name', 'Jimmy'}, {'city', 'Taipei'})
print(dict(my_data))
{'Jimmy': 'name', 'city': 'Taipei'}

# 有 keyword argument
my_dict = dict(name='Jimmy', age=20, city='Taipei')
print(my_dict)
{'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}

my_dict = dict({'name': 'Jimmy', 'age': 20}, city='Taipei')
print(my_dict)
{'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}

3. Common Operation

3.1 in

用來判斷 dict 裡面是否存在某個 key:


my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print('name' in my_dict)
True
print('college' in my_dict)
False

3.2 not in

用來判斷 dict 裡面是否不存在某個 key:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print('name' not in my_dict)
False
print('college' not in my_dict)
True

3.3 dict[key]

可以用 key 來存取對應的 value,但如果該 key 不存在,會 raise KeyError:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(my_dict['name'])
'Jimmy'
print(my_dict['college'])
KeyError: 'college'

3.4 get(key[, default])

用 key 來存取 value,第二個 argument 用來表示該 key 不存在時,要回傳什麼,default value 是 None:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(my_dict.get('name'))
Jimmy
print(my_dict.get('college'))
None
print(my_dict.get('college', 'key college not exists'))
key college not exists

3.5 len(dict)

用來表示這個 dict 有幾對 key-value pairs:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(len(my_dict))
3

4. Iteration of Keys and Values

4.1 list(dict)

將這個 dict 的所有 keys 放到 list 後回傳:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(list(my_dict))
['name', 'age', 'city']

4.2 iter(dict)

會將 dict 的 keys 作為 iterator 回傳:

延伸閱讀:Python Iterator 介紹
my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict_iter = iter(my_dict)
print(my_dict_iter)
<dict_keyiterator object at 0x102526700>
print(next(my_dict_iter))
name
print(next(my_dict_iter))
age
print(next(my_dict_iter))
city
print(next(my_dict_iter))
StopIteration

4.3 dict.keys()

會回傳 dictionary view objects,當 dict 的 key 有變動時,這個 object 也會一起變動:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict_keys = my_dict.keys()
print(my_dict_keys)
dict_keys(['name', 'age', 'city'])
my_dict['college'] = 'NTHU'
print(my_dict_keys)
dict_keys(['name', 'age', 'city', 'college'])

4.4 dict.values()

會回傳 dictionary view objects,當 dict 的 value 有變動時,這個 object 也會一起變動:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict_values = my_dict.values()
print(my_dict_values)
dict_values(['Jimmy', 20, 'Taipei'])
my_dict['college'] = 'NTHU'
print(my_dict_values)
dict_values(['Jimmy', 20, 'Taipei', 'NTHU'])

4.5 dict.items()

會回傳 dictionary view objects,當 dict 的 key, value 有變動時,這個 object 也會一起變動:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict_items = my_dict.items()
print(my_dict_items)
dict_items([('name', 'Jimmy'), ('age', 20), ('city', 'Taipei')])
my_dict['college'] = 'NTHU'
print(my_dict_items)
dict_items([('name', 'Jimmy'), ('age', 20), ('city', 'Taipei'), ('college', 'NTHU')])

5. 操作 dict

5.1 dict[key] = value

更新某個 key 的 value,或是新增某個 key-value pair:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict['name'] = 'Eric'
print(my_dict['name'])
Eric
my_dict['college'] = 'NTHU'
print(my_dict)
{'name': 'Eric', 'age': 20, 'city': 'Taipei', 'college': 'NTHU'}

5.2 dict.setdefault(key[, default])

如果 key 存在,回傳對應的 value,否則新增 key-value pair:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(my_dict.setdefault('name'))
Jimmy
print(my_dict.setdefault('college', 'NTHU'))
NTHU
print(my_dict)
{'name': 'Jimmy', 'age': 20, 'city': 'Taipei', 'college': 'NTHU'}

5.3 dict.pop(key[, default])

如果 key 存在,則移除對應的 key-value pair,並且回傳該 value。

如果 key 不存在,除非給 default argument,否則會 raise KeyError:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(my_dict.pop('age'))
20
print(my_dict)
{'name': 'Jimmy', 'city': 'Taipei'}
print(my_dict.pop('college'))
KeyError: 'college'
print(my_dict.pop('college', 'key college not exist'))
key college not exist

5.4 dict.popitem()

移除 dict 的最後一個 key-value pair:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(my_dict.popitem())
('city', 'Taipei')
print(my_dict)
{'name': 'Jimmy', 'age': 20}

5.5 del dict[key]

移除某個 key-value pair,如果該 key 不存在,會 raise KeyError:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
del my_dict['age']
print(my_dict)
{'name': 'Jimmy', 'city': 'Taipei'}
del my_dict['college']
KeyError: 'college'

5.6 dict.copy()

shallow copy dict:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_copy_dict = my_dict.copy()
print(my_copy_dict)

5.7 dict.clear()

清空 dict:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict.clear()
print(my_dict)
{}

5.8 reversed(dict)

回傳 reversed key iterator:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
reversed_dict_iterator = reversed(my_dict)
print(reversed_dict_iterator)
<dict_reversekeyiterator object at 0x1026d5940>
print(next(reversed_dict_iterator))
city
print(next(reversed_dict_iterator))
age
print(next(reversed_dict_iterator))
name
print(next(reversed_dict_iterator))
StopIteration

5.9 dict.update([other])

更新 dict,argument 可以是 dict,也可以放 keyword argument:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict.update({'name': 'Eric'})
print(my_dict)
{'name': 'Eric', 'age': 20, 'city': 'Taipei'}
my_dict.update(college='NTHU')
print(my_dict)
{'name': 'Eric', 'age': 20, 'city': 'Taipei', 'college': 'NTHU'}

5.10 dict | other (3.9+)

合併兩個 dict,如果有一樣的 key,後面的 value 會覆蓋掉前面的,不會改變原來的 dict:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
print(my_dict | {'name': 'Eric', 'college': 'NTHU'})
{'name': 'Eric', 'age': 20, 'city': 'Taipei', 'college': 'NTHU'}
print(my_dict)
{'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}

5.11 dict |= other (3.9+)

和 | operator 一樣,但會改變原來的 dict:

my_dict = {'name': 'Jimmy', 'age': 20, 'city': 'Taipei'}
my_dict |= {'name': 'Eric', 'college': 'NTHU'}
print(my_dict)
{'name': 'Eric', 'age': 20, 'city': 'Taipei', 'college': 'NTHU'}

參考資料

Built-in Types — Python 3.11.5 documentation

如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top