群集資料也是C語言生活中的一個日常,諸如宣告陣列、使用linked list或者字串,這幾乎是每一個程式一定會碰觸到的資料型態,在python中因為無型別的關係,所以可以快速的組建列表,也有很厲害的內建功能,下面會提到一些常用的。
在C語言中要宣告一個陣列:
int a1[10];
int a2[3] = {1, 2, 3}
printf("%d %d %d", a2[0], a2[1], a2[2])
而python的列表,是不需要宣告大小的,多退少補。在使用上則和C語言的陣列沒有差別,也是0-indexed:
a1 = []
a2 = [1, 2, 3]
print(a2[0], a2[1], a2[2])
若是想要為a1添加元素則需要透過append或insert:
a1.append(100)
a1.insert(0, 99)
想知道列表的長度?
a1_len = len(a1)
想排序?想計數?想反轉?想當stack?通通辦的到。
a1.sort()
a1.count(99)
a1.reverse()
a1.pop()
甚至可以直接拿兩個列表做比較,這是C辦不到的。
a1 == a2
也因為python的列表沒有大小限制,所以可以直接做疊加,讓一個列表掛在列一個列表後面:
a1 += a2
而列表之間也支援彼此嵌套,可以列表裡面包列表,例如:
a3 = [a1, 100, "hello", a2]
在python中有一個關鍵字(in)可以判斷元素有沒有在列表中,不需要去使用count,可以使程式碼看起來更漂亮。
a1 in a3
列表支援最棒的功能是切片和comprehension,comprehension可以快速組建列表而切片可以將列表按需求拆開,以下例子示範將一個列表從i和j兩個索引拆成三段:
a = [n ** 2 for n in range(20)]
a1, a2, a3 = a[:4], a[4:10], a[10:]
Comprehension是python的一個強大功能,可以根據規則快速構建列表,能夠使用for和if之類的表達式,甚至可以用function pointer。function pointer的例子會在之後講解。示例的range(20)其實也是一個列表,代表[0, 1, 2, 3, ..., 19]。若要產生一個奇數列表可以這樣:
b = [n for n in range(10) if n % 2]
在列表的最後介紹一下python的indexing,python的群集資料支援從前頭開始數(0開始),也支援從後面開始數(-1開始),剛剛a1, a2, a3的例子換個寫法也是等價的:
a1, a2, a3 = a[:-16], a[-16:-10], a[-10:]
但從後面數最常用的case其實也只有取後幾個元素或取最後一個:
last_n = a[-n:]
last = a[-1]