我是這樣學習Python列表的

微信公衆號: 冰咖啡與狗
一杯冰咖啡,一條狗,一個碎碎唸的程序員...

1. 列表

不一樣於 C++ 和 Java,在 Python 中,沒有在標準庫中內置數組類型,而是一般利用列表來表示數組,同時它也比數組的使用要靈活得太多。python

列表是 Python 中最基本的數據結構,列表中的元素的存儲是有序的,因此咱們能夠直接利用索引去訪問列表中的值。在學習數據結構時,咱們知道,對一個數據結構的操做,無外乎增刪改查四種。接下來本文將從這四個方面來介紹列表的一些經常使用小技巧。程序員

1.1. 列表中的增

對列表的增長操做有兩種,一種是建立一個新的列表,一種是在一個已有的列表中增長一個新元素。咱們首先介紹如何建立一個新的列表:編程

# 建立一個空列表
list1 = []
# 建立一個默認值爲0,長度爲n的列表
list2 = [0] * n
# 利用列表生成式建立列表
list3 = [i for i in range(10)]
# 5*5 二維列表
list4 = [[i for i in range(5)] for j in range(5)]
# 利用其餘數據結構生成列表, list() 函數接收一個可迭代對象做爲參數
tuple1 = (1, 2, 3)
list5 = list(tuple1)

# 字符串轉化爲列表
str1 = "I love code"
# 每一個元素做爲列表中的一個元素
list6 = list(str1)
# 按照指定字符分割
list7 = str1.split(" ")  # ['I', 'love', 'code']

在編程過程當中,有時咱們須要對一個列表進行操做,可是列表是一個可變對象,對列表的操做每每會改變其原本的順序結構。所以,當咱們不想改變列表原有的順序結構,咱們須要對舊的列表進行一個拷貝,而後在新的列表上進行操做。拷貝存在兩種,淺拷貝和深拷貝。可能有人會對這兩種拷貝存在疑問,他們獲得的列表的形式不是同樣的嘛?數組

是的,它們在拷貝後獲得的列表形式確實是同樣的。可是在進行操做時,就會有很大的差異了,特別是當你的列表中存在可變對象時。咱們只須要記住一點,淺拷貝只複製不可變對象,而深拷貝不只複製不可變對象,還複製了可變對象。如下進行舉例說明:微信

# 若是一個列表中的元素都是不可變對象,能夠直接用淺拷貝
list1 = [1, 2, 'i']

list2 = list1[::1]  # 淺拷貝
list3 = [i for i in list1]  # 淺拷貝
import copy
list4 = copy.copy(list1) # 淺拷貝

# 若是一個列表中的元素包含可變對象,要完成複製列表,須要用深拷貝
list5 = ["Will", 1, ["Python", "Java", "C++"]]
list6 = copy.deepcopy(list5)

爲何在包含不可變對象的時候,須要用到深拷貝呢?數據結構

上面咱們說過,淺拷貝只拷貝不可變對象。當列表中存在可變對象時,咱們能夠發現其引用 id 是同樣的,即它們是同一個對象,所以對 list5 的操做會影響到 list6 。而在深拷貝中,對於可變對象,在拷貝的新列表中會生成一個新的對象,因此對 list6 的修改不會影響到 list5 。app

id(list5[2]) # 2195936916360
id(list6[2]) # 2195936916744

對列表的另外一種增長操做就是在已有的列表的基礎上增長元素了,主要包括如下幾種操做:函數

list1 = ["I"]
# 在列表尾部增長一個新元素
list1.append("love")
# 合併兩個列表
list2 = ["Apple", 3]
list1.extend(list2)  # ["I", "love", "Apple", 3]
list1 = list1 + list2 # ["I", "love", "Apple", 3]
# 在指定位置插入元素
list1.insert(index=1, "not") # ["I", "not", "love", "Apple", 3]

1.2. 列表中的刪

對數據結構的刪除操做包括兩種,刪除整個列表,或者刪除列表中的某些元素。對於從內存中刪除整個列表,該操做十分簡單:學習

list1 = [1, 2, 3]
del list1

對於刪除列表中的元素,一樣可使用 del 語句,同時還可使用 remove() 函數。spa

list1 = [1, 2, 3]
print(list1) # [1, 2, 3]
del list1[1] 
print(list1) # [1, 3]

# 移除某個值的第一匹配項
list2 = [1, 2, 2, 3, 5]
list2.remove(2) # 移除第一個值爲 2 的元素

1.3. 列表中的改

修改操做即在原有的列表的基礎上對其進行修改,上面以及介紹了增長和刪除操做,這裏就對不改變元素的個數的操做進行介紹,主要包括排序和反轉列表等。

# 對一個整數列表進行排序
list1 = [9, 5, 6, 2, 7, 1, 3]
# 升序排列
list1.sort()  # [1, 2, 3, 5, 6, 7, 9]
list1 = sorted(list1) # [1, 2, 3, 5, 6, 7, 9]
# 降序排列
list1.sort(reverse=True) # [9, 7, 6, 5, 3, 2, 1]
list1 = sorted(list1, reverse=True) # [9, 7, 6, 5, 3, 2, 1]

# 指定鍵值排序
list1 = [('a', 3), ('b', 2), ('c', 1)]
list1.sort(key=lambda x:x[1]) # [('c', 1), ('b', 2), ('a', 3)]

## 反轉列表,即將原來的列表逆序排列
list2 = [4, 2, 3, 1]
list2 = list2[::-1] # [1, 3, 2, 4]
list2.reverse() # [1, 3, 2, 4]

1.4. 列表中的查

對列表的查找操做無外乎如下幾種:

  • 遍歷列表;
  • 查找指定索引的元素;
  • 查找指定值的元素;

列表的遍歷方式有三種,分別是根據索引遍歷、根據值遍歷和 enumerate()遍歷。

list1 = ["Python", "C++", "Java"]

# 方法 1
for i in range(len(list1)):
    print(list1[i])

# 方法 2 , 遍歷速度最高效,可是沒法記錄索引
for i in list1:
    print(i)

# 方法 3
for index, val in enumerate(list1):
    print(val)

查找元素有兩種,一種是按照索引查找,一種是遍歷按值查找。

# 查找指定索引的元素
list1 = [1, 3, 2, 5, 7, 8]
list1[3] # 返回索引爲 3 的元素,值爲5

# 查找指定值的元素
key = 5
for i in list1:
    if i == key:
        print("OK")

# 查找最大元素和最小元素
max(list1) # 8
min(list1) # 1

1.5. 其它小技巧

上述介紹了列表的增刪改查四種經常使用操做,固然對列表的操做不單單隻有這些,例如還有兩個列表的比較,列表結構的轉化等等。

比較兩個列表是不是同樣的,這裏的前提條件是這兩個列表對象不是同一個對象。

list5 = [("car", 1), ("bike", 2), ("foot", 3)]
list6 = [("car", 1), ("bike", 2), ("foot", 3)]
# 判斷兩個列表是不是同一個對象
list5 is list6 # False
# 判斷兩個列表是否相等
list5 == list6 # True

# 當列表中的元素不少,且結構複雜時,可使用 numpy 模塊
import numpy as np
a = np.array(list5)
b = np.array(list6)
(a == b).all()  # True

列表結構的轉化主要包括將列表轉化爲元組、集合、字符串和字典:

list1 = ["a", "b", "c", "d", "c"]
# 列表轉化爲元組
tuple1 = tuple(list1) # ('a', 'b', 'c', 'd', 'c')

# 列表轉化爲集合
set1 = set(list1) # {'a', 'b', 'c', 'd'}

# 列表轉化爲字符串
str1 = "".join(list1) # 'abcdc'

# 列表轉化爲字典,元素爲 key, 次數爲 value
from collections import Counter, defaultdict
dict1 = Counter(list1) # Counter({'a': 1, 'b': 1, 'c': 2, 'd': 1})
# 或者
dict2 = defaultdict(int)
for i in list1:
    dict2[i] += 1
dict2 # defaultdict(int, {'a': 1, 'b': 1, 'c': 2, 'd': 1})

1.6. 後記

歡迎掃碼關注公衆號冰咖啡與狗,一塊兒每日進步。

相關文章
相關標籤/搜索