Python學習筆記——(1)Python的數據結構

1 概述

  • Python的數據結構主要分爲:列表(list)、數組(array)、元組(tuple)、集合(set)和字典(dict)
  • 通常情況下這些都是基礎知識,也有一些騷操作和黑科技,比較有意思

2 列表(list)

  • 一種可以容納不同數據類型元素的數組

2.1 列表的創建

a = []  # 這就創建了一個空列表
  • 列表中可以包含數字、字符串等,還可以包含其他列表

2.2 列表索引

分爲正向索引和負向索引,這個經常用到,所以重視

b[0]
b[1]  # 這樣是正向索引
c[-1]  # 這樣是選中c中的最後一個元素
c[-2][0]  # 這種情況一般出現在C列表中包含列表的情況,
# c[-2]代表c的倒數第二個元素,其本身是一個列表,
# c[-2][0]即代表c倒數第二個元素中的第一個元素。
# 例如:
c = [1, 12.4, "This is fantastic!", 23]
print(c[-2][0])
# 輸出“T”
  • 注意這裏的字符串是一個字符數組,其也可以進行索引

2.3 列表的切片(重點)

  1. a[1:5]選擇a列表中的a[1]~a[4]5個元素
  2. b[:2]選擇b中前兩個元素(即b[0], b[1]
  3. b[2:]選擇b中後兩個元素(即b[-2], b[-1]
  4. c[1::2]選擇c中索引爲奇數的元素
  5. c[0::2]選擇c中索引爲偶數的元素

2.3.1 注意

  • 中括號中的參數,用冒號分隔。第一個參數是起始位置,最後一個參數是結束位置
  • 列表切片實行“左閉右開”原則,即得到的切片包含起始元素,但是不包含結束元素
  • 第4、5條中,其實是省略了中間的結束元素,增加了第二個冒號後的第三元素,這個元素的意思是步長,即每隔2個數,切一次。默認步長爲1.
  • 參數中,起始如果是0可以省略;結束如果是最後,也可以省略;步長如果是1,可以省略。
  • 切片後的列表和源列表是不同的列表,不會相互影響。

2.3.2 列表的複製和反轉

  • 如果直接用賦值表達式進行復制,如:
>>> a = ["I", "love", "Python"]
>>> b = a
# a的引用複製給b,在內存中其實是指向了用一個對象
>>> b is a
True
>>> id(a)
46381384
>>> id(b)
46381384
------
# 參考:【Python 中的比較:is 與 ==】https://www.cnblogs.com/kiko0o0/p/8135184.html
  • 可以發現b和a的內存地址是相同的,它們指向同一塊內存,因而 is 和 == 的結果都爲True。
  • 這樣如果改變b中的值,a的值也會隨之改變

  • 但是如果利用切片進行復制就不會出現這種情況:
>>> b = [1,2,3,4]
>>> a = b[:]
>>> a is b
False
>>> a == b
True
>>> id(a), id(b)
(1936921175624, 1936921176648)
  • 這裏注意一下,python的節省內存的方式是非常牛逼的,比如,在我創建完上面a,b兩個列表之後:
>>> a[0] is b[0]  # 值未改變的時候,元素中的內存是相同的
True
>>> a[0] = 10
>>> a[0] is b[0]  # 值改變之後,就會新建一個內存
False

  • 言歸正傳:
  • 複製:a = b[:],其實還有一個方法:a = b.copy()
  • 翻轉:a = b[::-1]

2.4 列表的元素動態添加

2.4.1 append 在末尾添加元素

>>> a
[10, 2, 3, 4]
>>> a.append(5)
>>> a
[10, 2, 3, 4, 5]

2.4.2 extend 一次性添加多個元素

>>> a,b
([10, 2, 3, 4, 5], [1, 2, 3, 4])
>>> a.extend(b)  # 將b中的元素加入到a的末尾
>>> a
[10, 2, 3, 4, 5, 1, 2, 3, 4]
>>> a.append(b)  # 直接將b這個列表加入a的末尾
>>> a
[10, 2, 3, 4, 5, 1, 2, 3, 4, [1, 2, 3, 4]]

2.4.3 insert 插入

>>> b
[1, 2, 3, 4]
>>> b.insert(1, '1')
>>> b
[1, '1', 2, 3, 4]

2.5 列表的元素動態刪除

2.5.1 clear 清空列表

  • 這個方法和a = []等價
>>> a,d
([10, 2, 3, 4, 5, 1, 2, 3, 4, [1, '1', 2, 3, 4]], [10, 2, 3, 4, 5, 1, 2, 3, 4, [1, '1', 2, 3, 4]])
>>> a.clear()
>>> d = []
>>> a,d
([], [])

2.5.2 pop 將列表的最後元素刪除,並作爲返回值返回

>>> b
[1, '1', 2, 3, 4]
>>> b.pop()
4
>>> b
[1, '1', 2, 3]

2.5.3 remove 去除某個元素(第一次出現)

>>> a = [1,2,3,2,5]
>>> a.remove(2)
>>> a
[1, 3, 2, 5]
>>> a.remove(2)
>>> a
[1, 3, 5]

2.6 列表元素的原地複製和翻轉

2.6.1 複製list.copy

  • 在2.3.2小節提到過,對於列表的複製,可以直接用切片b = a[:]複製,也可以使用a.copy進行復制
>>> a = [1,2,3,4]
>>> b = a[:]
>>> c = a.copy()
>>> b,c
([1, 2, 3, 4], [1, 2, 3, 4])

2.6.2 原地翻轉list.reverse

  • 對於列表的翻轉,在2.3.2小節提到的使用切片d = a[::-1]進行翻轉。但是這種翻轉是不會影響到a本身的值的。
  • 使用原地翻轉a.reverse可以實現對列表a本身的翻轉。
>>> a
[1, 2, 3, 4]
>>> a.reverse()
>>> a
[4, 3, 2, 1]

3 數組(array)

  • 僅支持一種數據類型的數組,其效率比列表要快,如果數組中僅有數字或字符串,建議使用這種數據結構。
  • array數組具有和list列表的很多相同的方法,這裏不再贅述
  • 【注意】使用數組時需要先引入array庫
>>> from array import array
>>> array_a = array('i', a)
>>> array_a
array('i', [4, 3, 2, 1])
>>> import sys
>>> sys.getsizeof(a), sys.getsizeof(array_a)  # 獲取所佔內存的大小
(96, 80)

4 元組(tuple)

  • 元素不可變的列表,使用()包含元素
  • 但是如果元組中嵌套了列表,可以改變列表中的內容,如:
>>> c = (1,2,3,4,a)
>>> c
(1, 2, 3, 4, [4, 3, 2, 1])
>>> c[4][0] = 1
>>> c
(1, 2, 3, 4, [1, 3, 2, 1])

5 集合(set)

  • 無重複元素的列表,使用{}包含元素
  • 相比於列表,集合查詢元素的速度更快,更容易實現數學上對集合定義的交併補差等操作
>>> a = {'123', '456', '123'}
>>> a
{'123', '456'}

6 字典(dict)

  • 擁有鍵(key)值(value)對的一種數據結構
  • 在默認情況下會查找鍵而不會查找值,除非顯式調用values()方法
  • 索引也是對於鍵的索引,而不是在字典中的位置。
>>> d
{1: 'a', 2: 'b', 'c': 3}
>>> 'a' in d
False
>>> 'a' in d.values()
True
>>> d[1]
'a'
>>> d['c']
3

下一章:python中的遍歷

發佈了83 篇原創文章 · 獲贊 303 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章