iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
自我挑戰組

Discord-bot,從0開始到做出一個機器人系列 第 7

字典與集合

字典特徵

字典和陣列類似,也是可變序列,但它是無序的,保存的內容是以「鍵:值」的形式存放的。
鍵是唯一的,但值可以有很多個。

特徵如下:

  1. 透過鍵而不是透過所引來讀取
  2. 無序
  3. 可變,可任意嵌套
  4. 鍵必須唯一
  5. 鍵不可變

字典的新增

  • 定義字典時,每個元素都包含兩個部分--鍵、值,兩者使用「:」隔開,所有元素都放在一個大括號中

  • 創建空字典

# 有兩種方法
name = {}
name = dict()
  • 也可以使用zip()函數
# name = dict(zip(list1, list2))

name = ['rex', 'xia', 'zhan']
sign = ['up', 'down', '5566']
test = dict(zip(name, sign))
print(test)
# {'rex': 'up', 'xia': 'down', 'zhan': '5566'}
  • 透過給定的鍵值創鍵字典
name = dict(id = "12345", email = "rex@gmail")
print(name)
# {'id': '12345', 'email': 'rex@gmail'}
  • 也可以使用fromkeys()創建空字典
name = ['xia', 'rex']
test = dict.fromkeys(name)
print(test)
# {'xia': None, 'rex': None}
  • 也可以使用已經存在的元組和陣列創建字典
# 元組:陣列、陣列:元組、元組:元組

name = ['xia', 'rex']
test = ('1', '2')
# (1)
dict1 = {test : name}
print(dict1)
# {('1', '2'): ['xia', 'rex']}

# (2)
dict2 = {name : test}
print(dict2)
# Traceback (most recent call last):
  #File "C:\Users\a9132\Desktop\python\1.py", line 3, in <module>
    #dict2 = {name : test}
#TypeError: unhashable type: 'list'

# (3)
dict3 = {test : test}
print(dict3)
# {('1', '2'): ('1', '2')}

刪除字典

dict_example = {'2':'3', '4','5'}
del dict_example

# 將字典內部清空
dict_example.clear()

當然還有pop()、popitem()等方法。這邊可以自己試一下
dict.pop(keyword)
dict.popitem() 直接刪除末尾的key-value

字典搜索

  • 直接搜尋
name = {"1":"2", "3":"4"}
print(name["1"])
# 2
  • 但實際在處理的時候,不一定會知道當前有什麼鍵......,比如可以這樣寫
name = {"1":"2", "3":"4"}
print(name["5"] if "5" in name else "查無此鍵")
# 查無此鍵
  • 使用get()得到value
name = {"1" : "2", "3" : "4"}
get_value = name.get("1")
print(get_value)
# 2

none_keyword = name.get("5", "沒有此key值")
print(none_keyword)
# 沒有此key值

在使用get()的時候,如果沒有找key,也就是key不存在的時候,得到的結果就是默認值

遍歷字典

# 需要用dict.items()函式獲得字典的鍵值對列表

name = {"1" : "2", "3" : "4"}
for item in name.items():
    print(item)
# ('1', '2')
# ('3', '4')
  • 如果想要獲取具體的每個鍵和值......
name = {"1" : "2", "3" : "4", "5" : "6"}
for key, value in name.items():
    print(key, " 的下一個是 ", value)
# 1  的下一個是  2
# 3  的下一個是  4
# 5  的下一個是  6

這邊也提供了values()、keys(),用於返回值、鍵

keys()會返回 ["鍵值", "鍵", ......]
values()回返回 dict_values(["值", "值", ......])

添加字典元素

  • 因為字典是可變序列,所以可以隨時增加鍵-值對
name = {"1" : "2", "3" : "4", "5" : "6"}
name['7'] = '8'
print(name)
# {'1': '2', '3': '4', '5': '6', '7': '8'}

修改字典元素

name = {"1" : "2", "3" : "4", "5" : "6"}
name["1"] = '0'
print(name)
# {'1': '0', '3': '4', '5': '6'}

刪除字典元素

name = {"1" : "2", "3" : "4", "5" : "6"}
del name['1']
print(name)
# {'3': '4', '5': '6'}

字典生成式

  • 可快速生成字典
import random

randdict = {i : random.randint(0, 100) for i in range(1, 5)}
print(randdict)
# {1: 35, 2: 88, 3: 38, 4: 77}

集合介紹

集合分為兩種,可變集合、不可變集合,本文已可變集合為主,也就是set函數的應用

創建集合

  • 直接用 {} 創建
name = {1, 2, 3, 6, 5, 0}
print(name)
# {0, 1, 2, 3, 5, 6}

set()是無序的,所以每次輸出的排序可能不同,不用在意

  • 使用set()函數建立
# setname = set(iteration)

name = set([1, 1, 2, 3, 4, 4])
print(name)
# {1, 2, 3, 4}

當出現重複元素時,會刷掉

往集合裡添加元素

  • 使用add()函數
name = set([0, 1, 2, 3])
name.add(4)
print(name)
# {0, 1, 2, 3, 4}

在集合裡刪除元素

  • 範例
name = set([0, 1, 2, 3, 4, 5])
name.remove(0)
print(name)
# {1, 2, 3, 4, 5}

name.pop()
print(name)
# {2, 3, 4, 5}

name.clear()
print(name)
# set()

使用交集、合集、差集運算

交集使用「&」
合集使用「|」
差集使用「-」
對稱差集使用「^」

  • 範例
name = set([0, 1, 2, 3])
example = set([0, 2, 3, 7])

print("交集: ", name & example)
# 交集:  {0, 2, 3}

print("合集: ", name | example)
# 合集:  {0, 1, 2, 3, 7}

print("差集: ", name - example)
# 差集:  {1}

上一篇
(),[] -- 列表與元組
下一篇
難搞的字串符
系列文
Discord-bot,從0開始到做出一個機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言