學過php的朋友應該知道,在其他語言里面的數組啊,列表啊,字典啊,在php里通通用一個數組就搞定了。但是既然學python了,就要注意區分,不要被其他語言的習慣影響了。
下面我以PHP開發人員的角度,來談談我對python里數組的看法。
首先,我們知道,php的數組分為“索引數組”和“關聯數組”。“索引數組”對應的就是python的列表(list),“關聯數組”對應的就是python的字典(dict)。
接下來詳細講講用法。
列表(list),左閉右開原則
list是一種有序的集合,可以隨時添加和刪除其中的元素。
也就是說,列表的下標是有序的,從0開始,可以根據下表讀取元素,也可以進行其他操作。
# 聲明、賦值 classmates = ['Michael', 'Bob', 'Tracy'] # 獲取列表的長度 classmates_len = len(classmates) print(classmates) print(classmates_len) # 訪問列表元素(正數第幾個,從0開始) print(classmates[0]) print(classmates[1]) # 訪問列表元素(倒數第幾個,從-1開始) print(classmates[-1]) print(classmates[-2]) # 追加元素 classmates.append('Adam') print(classmates) # 插入元素到指定位置 classmates.insert(1, 'Jack') print(classmates) # 刪除列表末尾元素 classmates.pop() print(classmates) # 刪除指定位置元素 classmates.pop(1) print(classmates)
# 刪除指定元素
classmates.remove('Bob')
# del語句
del classmate[2] # 替換指定元素 classmates[1] = 'Sarah' print(classmates) # list里面的元素的數據類型也可以不同 L = ['Apple', 123, True] print(L) # 列表可嵌套 s = ['python', 'java', ['asp', 'php'], 'scheme'] # 打印php print(s[2][1])
# 分片(不影響原列表,可以看成是拷貝的后續行為)
color = ['red','white','blue','pink','orange','black','green']
slice = color[2:5]
print(slice) # >>> ['blue','pink','orange']
print(color) # >>> ['red','white','blue','pink','orange','black','green']
# 簡寫
slice = color[:2] # >>> 表示從0開始,相當於color[0:2]
slice = color[3:] # >>> 表示從序號3到最后全部
slice = color[:] # >>> 得到一份列表的拷貝
執行的結果:
range(5)可以生成一個list,
生成的序列是從0開始小於5的整數
要計算1到n的累加和,只需要這樣
a = range(n+1)
sum = 0
for b in a:
sum += b
這里是0+1+2+...+n,相當於1+2+。。。+n
字典(dict)
Python內置了字典:dict的支持,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度。
也就是說,字典的下標不是有許多數字了,而是可以自定義的字符串,根據key也能很快找到value,是一種鍵值對的形式。就像查字典一樣
# 聲明、賦值 d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} print(d['Bob']) # 把數據放入dict的方法,除了初始化時指定外,還可以通過key放入 d['Adam'] = 67 print(d) # 替換 d['Adam'] = 33 print(d) # 如果key不存在,dict就會報錯,為了避免報錯,可以用這樣的寫法,賦予默認值 print(d.get('Thomas', -1)) # 刪除某個元素 d.pop('Bob') print(d)
執行的結果為:
和list比較,dict有以下幾個特點:
- 查找和插入的速度極快,不會隨着key的增加而變慢;
- 需要占用大量的內存,內存浪費多。
而list相反:
- 查找和插入的時間隨着元素的增加而增加;
- 占用空間小,浪費內存很少。
所以,dict是用空間來換取時間的一種方法。
好了,在比較了這兩種數據后,我們來看看另外兩種類型。
元組(tupe)
元組就是不變的列表。
tuple的陷阱:當你定義一個tuple時,在定義的時候,tuple的元素就必須被確定下來。
如果你想定義一個空的tuple,你可以寫成 d = ()
這里要注意一個事情!如果想定義一個只有一個元素的元組時,不能直接這樣a = (3),這樣會被認為a = 3,因為()不僅是元組,也可以被認為是數學的小括號,會產生歧義。要定義的話要這樣寫
# 定義 a = (3,) print(a)
執行的結果為:
tuple說是不變,其實也是相對的,比如
# "可變"tuple b = ('a',23,['L','S']) print(b) b[2][1] = 'V' print(b)
執行結果為:
看似變了,其實,這個b[2]的指向一直沒變,只不是過他指向的那個list變了,這是list的事了,tuple管不了。tuple只是保證指向不變。
集合(set)
set和dict類似,也是一組key的集合,但不存儲value。由於key不能重復,所以,在set中,沒有重復的key。
# 創建set,set沒有重復元素,因為key不能重復 s = set([1,32,4]) print(s) # 添加元素,重復的不會有效果 s.add(4) s.add(5) print(s) # 通過remove(key)方法可以刪除元素 s.remove(4) print(s) s.add('sun') print(s)
執行的結果:
總結一下:
key有序:列表(list),定義時用[]包裹,可變;元組(tuple),定義時用()包裹,不可變
key無序:字典(dict),定義時用{}包裹,鍵值對;set,定義時為a = set([...]),只有鍵,沒有值
注:python好像也有專門的數組array,好像說是要引用什么模塊。現在還沒接觸到,等接觸到了再更新這篇文章