天天看點

(D08)Python-元組,字典

元組 tuple

  • 元組是不可變的序列,同list一樣,元組是可以存儲任意類型

    的資料的容器

元組的表式方法:

  • 用小括号() 括起來,單個元素括起來後加逗号(,)區分單個

    對象還是元組

建立空元組的字面值:

-t = () # 建立一個空元組用t綁定

建立非空元組的字面值

t = 200,     # 建立一個隻有一個數字200的元組用綁定
  t = (20,)
  t = (1, 2, 3)
  t = 100, 200, 300
           

建立的元組的錯誤示例:

t = (20)  t綁定整數20,不是元組
  x, y, z = (100, 200, 300)  # 序列指派
  x, y, z = 100, 200, 300
  x, y, z = [100, 200, 300]
  x, y, z = "ABC"   # 序列指派,不是元組
  x, y = y, x  # 交換兩個變量的綁定關系
           

type(x) 函數傳回x的類型

元組的構造函數 tuple

  • tuple() 生成一個空的元組,等同于()
  • tuple(iterable) 用可疊代對象生成一個新的元組

示例:

t = tuple()
t = tuple("ABC")
t = tuple(range(1, 10, 3))  
           

元組的運算:

+    +=  *  *= 
  t = (1, 2, 3) + (4, 5, 6)  # t=(1,2,3,4,5,6)
  t = (1,2,3)
  t += (4,5,6)  # t = (1,2,3,4,5,6)
  t = (1,2) * 3  # t =(1,2,1,2,1,2)
  t = (1,2)
  t *= 3
           

比較運算:

  • < <= > >= == !=
  • 比較規則與清單的比較規則完全相同
  • in / not in運算符
    • 等同于清單的 in / not in 運算符
  • 索引 和 切片
    • 索引取值和切片取值的規則與清單完全相同
    • 注: 元組不支援 索引指派和切片指派

序列相關的函數也能用于元組中

  • len(x), max(x), min(x),
  • sum(x), any(x), all(x)

字典 dict

  • 什麼是字典
    1. 字典是一種可變的容器,可以存儲任意類型的資料
    2. 字典中的每個資料都是用"鍵"(key) 進行索引的,而不

      像序列(str,list,tuple)可以用整數進行索引

    3. 字典中的資料沒有先後順序關系,字典的存儲是無序的
    4. 字典中的資料以鍵(key)-值(value)對形式進行存儲
    5. 字典的鍵不能重複,且隻能用不可變類型作為字典的鍵

建立字典的字面值方式:

  • 字典的表示方式以{} 括起來,以冒号(? 分隔鍵值對,各鍵

    值對之間用逗号分隔開

  • 建立空字典:

    d = {}

  • 建立非空字典:

    d = {“姓名”: “tarena”, “年齡”: 15}

    d = {“one”: 1, “two”: 2}

    d = {1: “One”, 2: “二”, 3: [1,2,3]}

    d = {“a”: list(range(10))}

    d = {“a”: {“b”: 100, “c”:[1, 2, 3]}}

建立字典的構造函數 dict:

  • dict() # 生成一個空的字典 等同于 {}
  • dict(iterable) 用可疊代對象建立一個清單
  • dict(**kwargs) 關鍵字傳參形式生成一個字典

** 示例:**

d = dict()   
    L = [ (1, 2), [3, 4], "AB" ]
    d = dict(L)  # {1: 2, 3: 4, 'A': 'B'}
    d = dict(name="tarena", age=15)
        # d = {'age': 15, 'name': 'tarena'}
           
  • 字典的鍵必須為不可變類型的值

可變的類型有四種:

  • list(清單), dict(字典), set(集合),
  • bytearray(位元組數組)

    (除上述四種其它為不可變類型)

字典基本操作

  • 字典的鍵索引
  • 文法:
    • 字典[鍵]
  • 作用:
    • 用鍵擷取字典的鍵對應的值

**示例: **

d = {'name': 'tarena', 'age': 16}
 print(d['name'], "的年齡是", d['age'])
           

添加和修改字典的元素

  • 文法:
    • 字典[鍵] = 值
  • 說明:
    • 鍵不存在時,建立鍵,并讓鍵綁定對應的值
    • 鍵存在,修改鍵綁定的值

      示例:

      d = {}

      d[‘name’] = “小張” # 添加一個鍵值對

      d[‘年齡’] = 20 # 添加一個鍵值對

      d[‘年齡’] += 1 # 修改’年齡’ 這個鍵對應的值

練習:

寫一個程式,讓使用者分兩次輸入一個人的資訊:

資訊包含: 姓名 和 電話号碼

讓使用者多個人的資訊,當輸入姓名為空時結束輸入

把使用者輸入的資料存于字典中

姓名作為鍵, 電話号碼作為值

最後列印存儲資料的字典

如:

請輸入姓名: 小張

請輸入電話: 13888888888

請輸入姓名: 小李

請輸入電話: 13999999999

請輸入姓名: <回車>

列印:

{“小張”: 13888888888, “小李”: 13999999999}

删除字典元素

  • del 語句
    • 文法:
      • del 字典[鍵]

示例:

d = dict(name="小張", age=20)
del d['age']
print(d)  # {'name': '小張'}
           

字典的鍵判斷 in , not in運算符

  • 可以用 in 運算符判斷一個鍵是否存在于字典中,如果存在

    則傳回True, 否則傳回False

    • not in 傳回值與 in 相反

例如:

d = {'name' : 'tarena', 'age': 15}
'name' in d  # True
15 in d      # False
'age' not in d  # False
           

練習:

寫程式,實作以下需求:

1. 将如下資料形成一個字典 seasons

鍵           值
   1   ====>    '春季有1,2,3月'
   2   ====>    '夏季有4,5,6月'
   3   ====>    '秋季有7,8,9月'
   4   ====>    '冬季有10,11,12月'
           
  1. 讓使用者輸入一個整數代表這個季度,列印這個季度對應的

    資訊,如果使用者輸入的資訊不存在于字典内,則提示使用者

    ‘資訊不存在’

字典的疊代通路

  • 字典是可疊代對象,字典隻能對鍵進行疊代通路

示例:

  • d = {0:‘零’, 5:‘伍’, 1:‘壹’, 2:‘貳’}
  • for n in d:
    • print(n) # 0, 1, 2, 5

可以用于字典的函數:

len(x)    傳回字典的鍵值對的個數
  max(x)    傳回字典的鍵的最大值
  min(x)    傳回字典的鍵的最小值
  sum(x)    傳回字典的所有鍵的和
  any(x)    真值測試,隻對鍵進行測試,隻要有一個鍵為真值
            結果就為True
  all(x)    真值測試,所有鍵的真值結果才為True
           

示例:

d = {0:‘零’, 5:‘伍’, 1:‘壹’, 2:‘貳’}

len(x)

示例:

d = {0:'零', 5:'伍', 1:'壹', 2:'貳'}
for t in d.items():
    print(t)   # (0, '零'), (1, '壹'), (2, '貳'), (5, '伍')

for k, v in d.items():
    print("鍵是", k, '值是', v)
           

練習:

輸入一段字元串,列印出這個字元串中出現過的字元及出現過
  的次數
    如:
      輸入: abcdabcaba
    列印如下:
      a: 4次
      b: 3次
      d: 1次
      c: 2次
    注: 不要求列印順序
           

字典推導式

  • 字典推導式是用可疊代對象來建立字典的表達式
  • 文法:
    • {鍵表達式: 值表達式 for 變量 in 可疊代對象
      • [if 真值表達式]}
    • 注: []的内容代表可省略

示例:

  • 生成一個字典: 鍵為數字0~9, 值為鍵的平方
  • 如生成 {0: 0, 1:1, 2:4, 3: 9, … 9:81}
  • d = {x: x**2 for x in range(10)}
  • print(d)

字典推導式的嵌套

  • 文法同清單推導式嵌套

練習:

已知有如下字元串的清單:
    L = ['Tarena', 'XiaoZhang', 'xiaowang']
  生成如下字典:
    d = {'Tarena':6, 'XiaoZhang':9,
          'xiaowang':8}

練習:
  Nos = [1001, 1002, 1005, 1006]
  names = ['Tom', 'Jerry', 'Spike', 'Tyke']
  試生成如下字典:
    d = {1001: 'Tom', 1002: 'Jerry',
         1005: 'Spike', 1006: 'Tyke'}

  答案:
    d = {Nos[i]: names[i] for i in range(4)}
           

字典 VS 清單

  1. 都是可變的容器
  2. 索引方式不同,清單用整數索引,字典用鍵索引
  3. 清單的存儲是有序的,字典的存儲是無序的
  4. 字典的插入,删除,修改的速度可能會快于清單(重要)

問題:

L = [1, 3, 5, 8, 10]

for x in L:

L.remove(x)

print(L) # [3, 8]

練習:

  1. 生成前40個斐波那契數 (Fibonacci 數列)

      1 1 2 3 5 8 13 21 …

    要求: 将這些數存入在清單中

    最後列印出這些數

  2. 有一隻小猴子,摘了很多桃,

    第一天吃了全部的桃子的一半,感覺不飽又吃了一個

    第二天吃了剩下的一半,感覺不飽又吃了一個

    以此類推…

    到第10天,發現隻剩下一個了

    問: 第一天摘了多少桃子?

  3. 列印九九乘法表:

    1x1=1

    1x2=2 2x2=4

    1x3=3 2x3=6 3x3=9

    …9x9=81