【量化交易】 Python 入門(2)- 數據類型之列表【0015】

Python 入門(2)- 數據類型之列表

這是面向新用戶的 Python 教程,並結合了 JoinQuant 獲取到的數據進行了講解。

如果你之前沒有學過 Python, 或者對 Python 不熟,那不要再猶豫了,這個教程就是爲你準備的!

更多內容請查看量化課堂 - Python 編程板塊。

本節概要: 介紹了列表的主要用法

【Python入門(2)】基本語法-數據類型之列表

新手在使用平臺進行量化策略實現時,往往會被各種數據類型搞亂,不知道目前獲取的數據是什麼類型的,可以使用什麼方法,所以梳理了一下。

在Python中有多種內建的數據結構,我們這裏經常遇到的會有列表、字典、集合和元組,第三方庫pandas還提供DataFrame和Series。

將逐步詳細介紹列表、字典、集合、元組、DataFrame和Series的基本使用方法和小技巧,然後介紹在使用平臺獲取數據時不同數據類型的轉換。

Python內嵌的數據類型主要包括以下兩類:

有序:

List(列表),是有序集合,沒有固定大小,可以通過對偏移量以及其他方法修改列表大小。列表的基本形式如:[1,2,3,4]

Tuple(元組),是有序集合,是不可變的,可以進行組合和複製運算後會生成一個新的元組。元組的基本形式比如:(1,3,6,10)

String(字符串),也是有序集合,字符串的基本形式比如:’hello’,這裏不進行具體介紹。

無序:

Set(集合),是一個無序不重複元素的集。基本功能包括關係運算和消除重複元素。集合的基本形式如:set('abracadabra')

Dictionary(字典)是無序的鍵:值對 (key:value 對)集合,鍵必須是互不相同的(在同一個字典之內)。字典的基本形式如:{'jack': 4098, 'sape': 4139}

首先對列表進行介紹。

列表

List(列表) 是 Python 中最通用的序列。列表是一個任意類型對象位置的相關有序集合,它沒有固定大小。不像字符串,其大小是可以變的,通過對偏移量進行賦值以及其他各種列表的方法進行調用,可以修改列表大小。

索引是從0開始而非1開始!!

列表中值的分割用變量[頭下標:尾下標],就可以截取相應的列表,從左到右索引默認“0”開始的,從右到左索引默認-1開始,下標可以爲空表示取到頭或尾。可以對列表進行索引、切片等操作,看下面例子。

# 定義列表L
L = [1,2,3,4,5,6,7,8,9]

# 使用len()函數查看列表的長度
len(L)
9

①列表索引:

print L[0]
print L[-1] # 負數表示從後數第幾個元素,-1即爲列表的最後一個元素
1
9

②列表切片: (注意:切片並不會取到“尾下表”那個數)

L[1:5]
[2, 3, 4, 5]

③ +操作可以拼接列表

L + [2,3,4]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4]

Python 的列表數據類型包含更多的方法。

list.append(x) 把一個元素添加到列表的結尾。

list.extend(L) 將一個給定列表中的所有元素都添加到另一個列表中。

list.insert(i, x) 在指定位置插入一個元素。第一個參數是準備插入到其前面的那個元素的索引,例如 a.insert(0, x) 會插入到整個列表之前,而 a.insert(len(a), x) 相當於 a.append(x)。

list.remove(x) 刪除列表中值爲 x 的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。

list.pop([i]) 從列表的指定位置刪除元素,並將其返回。如果沒有指定索引,a.pop() 返回最後一個元素。元素隨即從鏈表中被刪除。(方法中 i 兩邊的方括號表示這個參數是可選的,而不是要求你輸入一對方括號,這個經常會在 Python 庫參考手冊中遇到這樣的標記。)

list.index(x) 返回列表中第一個值爲 x 的元素的索引。如果沒有匹配的元素就會返回一個錯誤。

list.count(x) 返回 x 在鏈表中出現的次數。

list.sort(cmp=None, key=None, reverse=False) 對列表中的元素進行排序(參數可以用來自定義排序方法,參考 sorted() 的更詳細的解釋)。

list.reverse() 就地倒排鏈表中的元素

del list[i] 有個方法可以從列表中按給定的索引而不是值來刪除一個子項:del 語句。它不同於有返回值的 pop() 方法。語句 del 還可以從列表中刪除切片或清空整個列表(我們以前介紹過一個方法是將空列表賦值給列表的切片)。

# 統計a中元素出現的次數
a = [1, 2, 3, 3, 1234.5]
print 'a中 1 出現的次數:',a.count(1)
print 'a中 3 出現的次數:',a.count(3) 
print 'a中 x 出現的次數:',a.count('x')
a中 1 出現的次數: 1
a中 3 出現的次數: 2
a中 x 出現的次數: 0
# 在a的尾部添加元素
a.append(555)
a
[1, 2, 3, 3, 1234.5, 555]
# 將[7,8,9]於a進行拼接
a.extend([7,8,9])
a
[1, 2, 3, 3, 1234.5, 555, 7, 8, 9]
# 在a中第三個位置插入-1
a.insert(2, -1)
a
[1, 2, -1, 3, 3, 1234.5, 555, 7, 8, 9]
# 返回2在a中的位置
a.index(2)
1
# 反向排列a
a.reverse()
a
[9, 8, 7, 555, 1234.5, 3, 3, -1, 2, 1]
# 對a進行排序,默認爲升序!
a.sort()
a
[-1, 1, 2, 3, 3, 7, 8, 9, 555, 1234.5]
# 逆序排列a
a.sort(reverse=True)
a
[1234.5, 555, 9, 8, 7, 3, 3, 2, 1, -1]
# 刪除列表a中值爲 3 的第一個元素
a.remove(3)
a
[1234.5, 555, 9, 8, 7, 3, 2, 1, -1]
# 刪除a中索引爲0的元素
del a[0]
a
[555, 9, 8, 7, 3, 2, 1, -1]
# 刪除a中索引爲 2:4 的元素
del a[2:4]
a
[555, 9, 3, 2, 1, -1]

del 也可以刪除整個變量,此後再引用命名 a 會引發錯誤(直到另一個值賦給它爲止)。我們在後面的內容中可以看到 del 的其它用法。

del a
a
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-16-ef9d13752aff> in <module>()
      1 del a
----> 2 a

NameError: name 'a' is not defined

把列表當作堆棧使用

列表方法使得列表可以很方便的做爲一個堆棧來使用,堆棧作爲特定的數據結構,最先進入的元素最後一個被釋放(後進先出)。用 append() 方法可以把一個元素添加到堆棧中。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來。例如:

stack = [3, 4, 5]
stack.append(6)
stack.append(7)
stack
[3, 4, 5, 6, 7]
stack.pop()    #後進先出
7
stack
[3, 4, 5, 6]
print stack.pop()
print stack.pop()
print stack
6
5
[3, 4]

把列表當作隊列使用

你也可以把列表當做隊列使用,隊列作爲特定的數據結構,最先進入的元素最先釋放(先進先出)。不過,列表這樣用效率不高。相對來說從列表末尾添加和彈出很快;在頭部插入和彈出很慢(因爲爲了一個元素,要移動整個列表中的所有元素)。

要實現隊列,使用 collections.deque,它爲在首尾兩端快速插入和刪除而設計。例如:

from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry")
queue.append("Graham")
queue
deque(['Eric', 'John', 'Michael', 'Terry', 'Graham'])
print queue.popleft()                 # 先到的先出
print queue.popleft()
print queue
Eric
John
deque(['Michael', 'Terry', 'Graham'])

這一節就學到這裏就結束了。

下一節會向大家介紹數據類型的另一個重要成員——字典!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章