列表则果、元組、字典漩氨、集合和固定集合

回顧

  • 循環(huán)語句

    • while 語句
    • for 語句
  • 循環(huán)相關(guān)的語句

    • break 語句
    • continue 語句
  • range() 函數(shù)

range(6) # [0, 1, 2, 3, 4, 5]
range(1, 10) # [1, 2, 3, 4, ... 9]
range(1, 10, 2) # [1, 3, 5, 7, 9]
range(10, 1, -3) # [10, 7, 4]

列表 list

  • 列表是一種可以存放任意數(shù)據(jù)類型的序列容器

  • 列表是可迭代對象

    所有的可迭代對象都一個用 for 語句獲取其中的數(shù)據(jù)元素

  • 創(chuàng)建

    L = []
    L = list()
    L = [1, 2, 3]
    L = list(range(5))
    
  • 運(yùn)算

    L = [1, 2, 3] + [4, 5, 6]   # 拼接
    L += [7, 8, 9]              # L.extend([7, 8, 9])  # 拆開后依次追加
    L = [1, 2] * 3
    L *= 3
    

    in / not in 運(yùn)算

    if 2 in L:
        print("2 在 L 中")
    else:
        print("2 不在 L 中")
    

    索引運(yùn)算

    print(L[2])
    

    切片運(yùn)算

    print(L[::2])
    

    索引和切片可以用于所有的序列中(str, list, tuple, bytes, bytearray)

  • 列表的增刪改查

    • L = []
      L.append(1)        # L = [1]
      L.insert(0, 100)   # L = [100, 1]
      
    • L = [1, 2, 3, 4, 5, 6]
      L.remove(3)   # L = [1, 2, 4, 5, 6]
      del L[3]      # 按位置(索引)刪除
      L.clear()     # 清空
      
    • L = ['A', 2, 'C']
      L[1] = 'B'   # L = ['A', 'B', 'C']
      
    • L = ['A', 2, 'C']
      a = L[1]
      

列表的常用方法

運(yùn)算 結(jié)果
s.index(x[, i[, j]]) xs 中首次出現(xiàn)項(xiàng)的索引號(索引號在 i 或其后且在 j 之前)
s.count(x) xs 中出現(xiàn)的總次數(shù)
s.append(x) x 添加到序列的末尾 (等同于 s[len(s):len(s)] = [x])
s.clear() s 中移除所有項(xiàng) (等同于 del s[:])
s.copy() 創(chuàng)建 s 的淺拷貝 (等同于 s[:])
s.extend(t)s += t t 的內(nèi)容擴(kuò)展 s (基本上等同于 s[len(s):len(s)] = t)
s.insert(i, x) 在由 i 給出的索引位置將 x 插入 s (等同于 s[i:i] = [x])
s.pop([i]) 提取在 i 位置上的項(xiàng)短条,并將其從 s 中移除
s.remove(x) 刪除 s 中第一個 s[i] 等于 x 的項(xiàng)目。
s.reverse() 就地將列表中的元素逆序才菠。
s.sort( key=None, reverse=False) 對列表內(nèi)的數(shù)據(jù)進(jìn)行排序, reverse=False 升序排序茸时,否則是降序排序

示例:

s = [1, "二", 3]
value = s.pop(1)   # s= [1, 3]; value = '二'
>>> s = [1, 2, 3, 5]
>>> s.reverse()   # 反轉(zhuǎn)
>>> s
[5, 3, 2, 1]
>>> s = [1, 2, 3, 4, 2, 2, 3, 4]
>>> s.index(3)  # 返回第一次出現(xiàn)的位置的索引
2
>>> s.index(3, 4)
6
>>> s.index(100)  # 觸發(fā)異常,要用try 語句處理
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ValueError: 100 is not in list
>>> s.count(3)  # 在列表 s 中 找出所有值為3 的元素的個數(shù)赋访,并返回
2
>>> s.count(2)
3
>>> L1 = [2, 4, 6, 8, 9, 1]
>>> L1.reverse()
>>> L1
[1, 9, 8, 6, 4, 2]
>>> s.sort()   # 排序可都,默認(rèn)是升序排序
>>> s
[1, 2, 2, 2, 3, 3, 4, 4]
>>> s.sort(reverse=True)
>>> s
[4, 4, 3, 3, 2, 2, 2, 1]
  • python3 中常用于序列的函數(shù)
運(yùn)算 結(jié)果
len(s) s 的長度
min(s) s 的最小項(xiàng)
max(s) s 的最大項(xiàng) # 課間休息: 11:11 回來
sum(s) 求 s內(nèi)所有數(shù)字的和(不允許有其他數(shù)據(jù))
>>> L = [1, 5, 8]
>>> len(L)
3
>>> min(L)
1
>>> max(L)
8
>>> sum(L)
14

列表解析(也叫列表推導(dǎo)式)

  • 作用

    用簡單的表達(dá)式方式來創(chuàng)建列表

  • 語法規(guī)則

    [ 表達(dá)式 for 自定義變量 in 可迭代對象 ]
    # 或
    [ 表達(dá)式 for 自定義變量 in 可迭代對象 if 真值表達(dá)式 ]

  • 示例

    # 生成一個列表缓待, 里面有 100 個數(shù)是[1, 4, 9, 16, 25, ...]
    # 用 for 語句實(shí)現(xiàn)
    L = []
    for x in range(1, 101):
    L.append(x ** 2)
    print(L)

    # 用列表推導(dǎo)式
    L2 = [ x ** 2 for x in range(1, 101)]
    print(L2)
    L3 = [ x ** 2 for x in range(1, 101) if x % 2 == 0] # 取出所有的偶數(shù)
    # L3 = [4, 16, 36, ...]

  • 練習(xí):

    寫程序,輸入任意行文字渠牲。當(dāng)沒有輸入的時(shí)候時(shí)結(jié)束旋炒,
    將所有輸入的字符串先保存在一個列表L1中 ,
    將L1 中的字符串的長度都計(jì)算出來,存入列表L2 中
    1) 然后打印最長的字符串的字符個數(shù)
    2) 打印最長的那個字符串
    如:
    請輸入: hello
    請輸入: abcdef
    請輸入: a
    請輸入: <直接回車結(jié)束輸入>
    打忧╄尽:
    最長的字符個數(shù)是: 5
    最長的字符串是: abcdef
    L1 = ['hello', 'abcdef', 'a']
    L2 = [5, 6, 1]
    mymax = 6 # 求出最長的字符串的長度
    pos = L2.index(6) # 求出最長的字符串的位置
    ...

元組 tuple

元組是不可改變的列表, 同 列表list 一樣瘫镇,元組可以存放任意類型的數(shù)據(jù),但是答姥,一旦創(chuàng)建將不可修改

  • 創(chuàng)建元組的字面值

    用小括號() 括起來铣除,單個元素括起來后加逗號來區(qū)分單個元素還是元組

    t = ()         # 空元組
    t = (100,)     # 含有一個數(shù)據(jù)元素的元組
    t = 100,       # 含有一個數(shù)據(jù)元素的元組
    t = (1, 2, 3)  # 含有三個數(shù)據(jù)元素的元組
    t = 1, 2, 3    # 含有三個數(shù)據(jù)元素的元組
    

    type(x) 函數(shù)用來返回?cái)?shù)據(jù)x的類型

  • 創(chuàng)建元組的函數(shù) tuple

    t = tuple()          # t = ()
    t = tuple(range(5))  # t = (0, 1, 2, 3, 4)
    
  • tuple 的運(yùn)算

    tuple 是序列的一種, 同列表的運(yùn)算鹦付,但是不可以修改元組

    >>> t = (1, 2, 3) + (4, 5, 6)
    >>> t += (7, 8, 9)
    >>> t = t * 2
    >>> t *= 2
    >>> 5 in t
    True
    >>> t[0]
    1
    >>> t[0:2]
    (1, 2)
    

    元組的方法

    運(yùn)算 結(jié)果
    s.index(x[, i[, j]]) xs 中首次出現(xiàn)項(xiàng)的索引號(索引號在 i 或其后且在 j 之前)
    s.count(x) xs 中出現(xiàn)的總次數(shù)

容器都是可迭代對象, 可以用for 語句來遍歷容器

for x in [1, 2, 3]:
    print(x)

for y in (1, 2, 3):
    print(y)
  • 列表和元組的 + 和 += 運(yùn)算

    # 列表(可變)
    >>> L1 = [1, 2, 3] + [4, 5, 6]
    >>> L2 = L1  # 兩個變量同時(shí)綁定同一個列表
    >>> L2 += [7, 8, 9]
    >>> print(L1)   # [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> print(L2)   # [1, 2, 3, 4, 5, 6, 7, 8, 9]
    # 元組(不可變)
    >>> T1 = (1, 2, 3) + (4, 5, 6)
    >>> T2 = T1  # 兩個變量同時(shí)綁定同一個元組
    >>> T2 += (7, 8, 9)
    >>> print(T1)   # (1尚粘,2, 3, 4, 5, 6)
    >>> print(T2)   # (1, 2, 3, 4, 5, 6, 7, 8, 9)
    

字典 dict

  • 什么是字典

    • 字典是一種可變的容器,可以存儲任意類型的數(shù)據(jù)
    • 字典的數(shù)據(jù)都是以鍵(key)-值(value)對的形式進(jìn)行映射存儲.
    • 字典的數(shù)據(jù)是無序的
    • 字典的鍵不能重復(fù)敲长,且之能用不可變類型作為字典的鍵
    • 字典中的數(shù)據(jù)只能用"鍵"key 進(jìn)行索引郎嫁,不能用整數(shù)進(jìn)行索引
  • 創(chuàng)建字典的字面值:

    字典的表示方式以 {} 括起來, 以英文的冒號 (:) 分隔鍵值對祈噪,各鍵值對之間用逗號(,)分隔

    d = {}    # 創(chuàng)建空字典
    d = {'name': "weimingze", "age": 35}
    d = {'a': [1, 2, 3]}
    d = {'b': {"bb": 222}}
    d = {1:'壹', 2:'貳', 5:'伍'}
    d = {(1, 2, 3):'壹貳伍'}
    
  • 以下寫法會存在問題

    d = {'a': 1, 'b': 2, 'a': 3}  # 字典的鍵不能重復(fù) d = {'a': 3, 'b': 2} 
    d = {[1, 2, 3]: 'a'}          # 不能用可變類型作為字典的鍵  # 報(bào)錯
    
  • dict 的創(chuàng)建函數(shù) dict

    d = dict()   # d = {}
    d = dict([("name", "魏明擇"), ("age", 35)])  # {'name': '魏明擇', 'age': 35}
    d = dict(a=1, b=2, c=3)    # {'a':1, 'b':2, 'c':3}
    d = dict([1, 2, 3, 4])  # 錯
    

    注: python 中有四種可變類型

    1. 列表 list
    2. 字典dict
    3. 集合 set
    4. 字節(jié)數(shù)組 bytearray
    persons = [
    {'name': 'weimz', 'age': 35},
    {'name': '小張', 'age': 18},
    ]
    
  • 字典的鍵索引

    • 語法

    字典[鍵key]

    用鍵索引可以查看字典中的數(shù)據(jù)

    • 示例:

      d = {'one': 1, 'two': 2}
      print(d['two'])
      
  • 添加和修改字典的元素

    • 語法

    字典[鍵key] = 表達(dá)式
    鍵不存在, 會創(chuàng)建鍵并綁定鍵對應(yīng)的值

    鍵存在, 會改變鍵對應(yīng)的值

    • 示例:

      d = {}
      d['name'] = 'tarena'  # 添加鍵值對  d = {'name': 'tarena'}
      d['age'] = 18         # d = {'name': 'tarena', 'age': 18}
      d['age'] = 19         # 改變 'age' 鍵對應(yīng)的值 d = {'name': 'tarena', 'age': 19}
      
  • 刪除 字典的元素

    • 語法

      del 字典[鍵]
      
    • 示例:

      >>> d = dict(a=1, b=2)   # d = {'a': 1, 'b': 2}
      >>> del d['a']
      >>> d
      {'b': 2}
      
  • in / not in 運(yùn)算符

    用 in 可以判斷一個鍵是否存在于字典中,如果存在返回 True, 否則返回 False

    not in 與 in 相反

    • 示例

      >>> d = dict(a=1, b=2)   # d = {'a': 1, 'b': 2}
      >>> 'a' in d
      True
      >>> 1 in d
      False
      >>> 'hello' not in d
      True
      
  • 字典是可迭代對象, 字典只能對所有的鍵進(jìn)行迭代訪問

    >>> d = {'name': 'tarena', 'age': 19}
    >>> for k in d:
    ...   print(k)
    ... 
    name
    age
    >>> for k in d:
    ...     print("key=", k, 'value=', d[k])
    ... 
    key= name value= tarena
    key= age value= 19
    
  • 字典的常用方法

    方法D代表字典 說明D
    D.clear() 清空字典
    D.copy() 復(fù)制
    D.get(key[, default]) 如果 key 存在于字典中則返回 key 的值泽铛,否則返回 default。 如果 default 未給出則默認(rèn)為 None辑鲤,因而此方法絕不會引發(fā) KeyError厚宰。
    D.pop(key) 移除鍵, 同時(shí)返回鍵對應(yīng)的值
  • 示例

    >>> d = {'name': 'tarena', 'age': 19}
    >>> 
    >>> d['age']
    19
    >>> d['address']
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    KeyError: 'address'
    >>> d.get('address', '未填寫住址')
    '未填寫住址'
    >>> d.get('age', 0)
    19
    >>> n = d.pop('name')
    >>> d
    { 'age': 19}
    >>> n
    'tarena'
    

列表、元組遂填、字典小結(jié)

  1. 列表和元組是有序的铲觉,字典的存儲是無序的

  2. 列表、字典是可變的,元組是不可變的

  3. 字典的鍵索引速度快吓坚,列表的整數(shù)索引速度快

  4. 列表和元組是順序存儲的撵幽,字典是散列存儲的

    d = {'a':1, 'b':2, .........}
    print(d['c']) # 速度快
    L = [7, 5, 1, ........]
    print(L[10009]) # 速度快

  1. 字典的 in / not in 運(yùn)算符快于 列表的 in / not in 運(yùn)算符

L = ['孫悟空', '趙云', '呂布', ...]
if '王昭君' in L: # 速度慢
pass
D = {'孫悟空':'花果山', '趙云':'長山', '呂布':'石家莊', .....}
if '王昭君' in D: # 速度快
pass

集合 set/ 固定集合 frozenset

  • 集合是可變的容器办成,固定集合是不可變的集合
  • 集合相當(dāng)于只有鍵沒有值的字典
  • 集合是無序的存儲結(jié)構(gòu)
  • 集合內(nèi)的數(shù)據(jù)都是唯一的尸诽,不可變的
  • 創(chuàng)建集合的方式

    空集合 set()

    非空集合 用 {} 括起來窗怒,值用逗號分隔開

    s = set()            # 用函數(shù)空集合
    s = {1, 2, 3, 4}     # 創(chuàng)建非空集合的字面值
    s = set(range(5))    # 調(diào)用 set(可迭代對象) 來創(chuàng)建集合 s = {0, 1, 2, 3, 4}
    s = set("ABC")       # s = {'B', 'C', 'A'}
    s = set("ABCCCCCCC")  # s = {'B', 'C', 'A'}
    s = set(['ABC'])      # s = {'ABC'}
    
  • 創(chuàng)建固定集合frozensets的方式

    fs = frozenset()              # 空固定集合 fs = frozenset()
    fs = frozenset([1, 2, 3])     # fs =  frozenset({1, 2, 3})
    

集合和固定集合的運(yùn)算

  • in/ not in 運(yùn)算符 與列表相同

  • 其他運(yùn)算

    &   交集
    |   并集
    -   補(bǔ)集
    ^   對稱補(bǔ)集
    <   子集
    >   超集
    
  • 示例

    s1 = {1, 2, 3}
    s2 = {2, 3, 4}
    s3 = s1 & s2   # s3 = {2, 3}  # 交集(只輸出重復(fù)的)
    s4 = s1 | s2   # s4 = {1, 2, 3, 4 }  并集(全部輸出颊咬,加上去重)
    s5 = s1 - s2   # s5 = {1}   補(bǔ)集(s1 補(bǔ)集 s2 就輸入 s1 補(bǔ)集)
    s6 = s1 ^ s2   # s6 = {1, 4}  # 對稱補(bǔ)集(不輸出重復(fù)的)
    s7 = {1, 2} < {1, 2, 3}  # s7 = True (123 是 12 的子集)
    s8 = {1, 2} > {1, 2, 3}  # s8 = False (12 是 123 的超集)
    s9 = {4, 5, 6, 7} > {5, 6}  #  {4, 5, 6, 7} 是 {5, 6} 的超集
    
  • 集合set的方法

    方法 說明
    S.add(e) 添加e
    S.remove(e) 刪除e
    S.clear() 清空集合
    S.pop() 移除一個并返回,如果集合為空則觸發(fā)ValueError
  • 容器總結(jié)

    • 可變和不可變

      • 可變的容器

    list dict set bytearray(字節(jié)數(shù)組)

    • 不可變得容器

    tuple, frozenset, bytes(字節(jié)串)

    • 有序和無序

      • 有序

        list tuple bytes bytearray

      • 無序

        dict set frozenset

  • 課后練習(xí)1

寫程序, 輸入一個整數(shù)n拴还,打印 寬度為n 的正方形
如:
請輸入: 4
打印:
####
# #
# #
####
請輸入: 5
打印:
#####
# #
# #
# #
#####

  • 課后練習(xí)2

寫一個程序援奢,輸入任意行文字驻债,當(dāng)輸入為空字符串時(shí)結(jié)束輸入挚躯,將所有的字符串以最長的字符串寬度打印如下方框
請輸入: hello
請輸入: hello world
請輸入: <回車輸入結(jié)束>
+-------------+
| hello |
| hello world |
+-------------+

  • 課后練習(xí)3(明天再完成)

寫一個程序: 輸入一個整數(shù)强衡,代表樹干的高度,打印如下圣誕樹
請輸入: 3
打印:

  *
 ***
*****
  $
  $
  $

請輸入: 4
打印:

   *
  ***
 *****
*******
   $
   $
   $ 
   $
  • 課后練習(xí)4

算出 100 ~ 999 的水仙花數(shù)
水仙花數(shù)是 指百位的3次方 + 十位的3次方 + 各位的3次方 等于原數(shù)的數(shù)
打印出所有的 水仙花數(shù)

153=1^3+5^3+1^3

  • 課后練習(xí)5

打印 九九 乘法表
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
....
1x9=9 ........ 9x9=81

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末码荔,一起剝皮案震驚了整個濱河市漩勤,隨后出現(xiàn)的幾起案子感挥,更是在濱河造成了極大的恐慌,老刑警劉巖越败,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件触幼,死亡現(xiàn)場離奇詭異,居然都是意外死亡究飞,警方通過查閱死者的電腦和手機(jī)置谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亿傅,“玉大人媒峡,你說我怎么就攤上這事「だ” “怎么了丝蹭?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵慢宗,是天一觀的道長坪蚁。 經(jīng)常有香客問我,道長镜沽,這世上最難降的妖魔是什么敏晤? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缅茉,結(jié)果婚禮上嘴脾,老公的妹妹穿的比我還像新娘。我一直安慰自己蔬墩,他們只是感情好译打,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拇颅,像睡著了一般奏司。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上樟插,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天韵洋,我揣著相機(jī)與錄音,去河邊找鬼黄锤。 笑死搪缨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸵熟。 我是一名探鬼主播副编,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼流强!你這毒婦竟也來了齿桃?” 一聲冷哼從身側(cè)響起惑惶,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎短纵,沒想到半個月后带污,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡香到,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年鱼冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悠就。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡千绪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梗脾,到底是詐尸還是另有隱情荸型,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布炸茧,位于F島的核電站瑞妇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梭冠。R本人自食惡果不足惜辕狰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望控漠。 院中可真熱鬧蔓倍,春花似錦、人聲如沸盐捷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碉渡。三九已至聚谁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爆价,已是汗流浹背垦巴。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铭段,地道東北人骤宣。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像序愚,于是被迫代替她去往敵國和親憔披。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容