Python 入門(3)- 數據類型之字典
這是面向新用戶的 Python 教程,並結合了 JoinQuant 獲取到的數據進行了講解。
如果你之前沒有學過 Python, 或者對 Python 不熟,那不要再猶豫了,這個教程就是爲你準備的!
更多內容請查看量化課堂 - Python 編程板塊。
本節概要: 介紹了字典的主要用法
【Python入門(3)】基本語法-數據類型之字典
字典(dictionary)
字典在某些語言中可能稱爲 聯合內存 (associative memories) 或 聯合數組 (associative arrays)。序列是以連續的整數爲索引,與此不同的是,字典以"關鍵字"爲索引,關鍵字可以是任意不可變類型,通常用字符串或數值。如果元組中只包含字符串和數字,它可以作爲關鍵字,如果它直接或間接地包含了可變對象,就不能當做關鍵字。不能用列表做關鍵字,因爲列表可以用索引、切割或者 append() 和 extend() 等方法改變。
字典是無序的鍵:值對 (key:value 對)集合,鍵必須是互不相同的(在同一個字典之內)。使用大括號創建一個空的字典:{}。初始化列表時,在大括號內放置一組逗號分隔的鍵:值對,這也是字典輸出的方式。
字典的主要操作是依據鍵來存儲和取值。也可以用 del 來刪除鍵:值對(key:value),從一個不存在的鍵中取值會導致錯誤。
tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
print tel
print tel['jack']
{'sape': 4139, 'jack': 4098, 'guido': 4127}
4098
del tel['sape']
tel['irv'] = 4127
print tel
print tel.keys()
print'guido' in tel
{'jack': 4098, 'irv': 4127, 'guido': 4127}
['jack', 'irv', 'guido']
True
常見字典操作方法
D.clear()刪除字典內所有元素
D.copy()返回一個字典的複製
D.fromkeys(seq,val)創建一個新字典,以序列seq中元素做字典的鍵,val爲字典所有鍵對應的初始值
D.get(key, default=None)返回指定鍵的值,如果值不在字典中返回default值
D.has_key(key)如果鍵在字典dict裏返回true,否則返回false
D.items()以列表返回可遍歷的(鍵, 值) 元組數組
D.keys()以列表返回一個字典所有的鍵
D.setdefault(key, default=None)和get()類似, 但如果鍵不存在於字典中,將會添加鍵並將值設爲default
D.update(dict2)把字典dict2的鍵/值對更新到dict裏
D.values()以列表返回字典中的所有值
D.pop(key)刪除一個鍵並返回它的值,類似於列表的pop,只不過刪除的是一個鍵不是一個可選的位置
del D[key]刪除鍵
D[key] = 42新增或修改鍵
字典用法注意事項:
-
序列運算無效,字典元素間是沒有順序的概念
-
對新索引賦值會添加項
-
鍵不一定總是字符串
字典鍵也常用於實現稀疏數據結構。例如,多維數組中只有少數位置上有存儲的值:
tel.get('kkk',0) #返回指定鍵的值,如果值不在字典中返回default值
0
多種構造字典方式
dict() 構造函數可以直接從 key-value 對中創建字典
dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'guido': 4127, 'jack': 4098, 'sape': 4139}
dict.fromkeys(['a','b'],0) #創建一個新字典,以序列seq中元素做字典的鍵,val爲字典所有鍵對應的初始值
{'a': 0, 'b': 0}
dict(zip(['a','b','c'],[1,2,3]))
{'a': 1, 'b': 2, 'c': 3}
{k:v for (k,v) in zip(['a','b','c'],[1,2,3])}
{'a': 1, 'b': 2, 'c': 3}
此外,字典推導式可以從任意的鍵值表達式中創建字典:
{x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
如果關鍵字都是簡單的字符串,有時通過關鍵字參數指定 key-value 對更爲方便:
D = dict(a=1,b=2,c=3)
D
{'a': 1, 'b': 2, 'c': 3}
{c:c*4 for c in 'JoinQuant'}#默認是集合
{'J': 'JJJJ',
'Q': 'QQQQ',
'a': 'aaaa',
'i': 'iiii',
'n': 'nnnn',展開輸出 ↓
{c:c*4 for c in ['JoinQuant']}
{'JoinQuant': 'JoinQuantJoinQuantJoinQuantJoinQuant'}
{c.lower():c*4+'!' for c in 'JoinQuant'}
{'a': 'aaaa!',
'i': 'iiii!',
'j': 'JJJJ!',
'n': 'nnnn!',
'o': 'oooo!',展開輸出 ↓
注意:
我們一般都很願意使用DataFrame,因爲它方便,顯示清楚,但是其創建和操作速度較慢,如果你對程序運行速度有較高要求, 可以考慮使用dict。目前平臺中使用到的字典主要有:
handle_data(context, data)裏的data是一個字典(dict), key是股票代碼, value是當時的SecurityUnitData 對象
get_open_orders(),獲得當天的所有未完成的訂單,返回一個dict, key是order_id, value是Order對象
get_orders(),獲取當天的所有訂單,返回一個dict, key是order_id, value是Order對象
get_trades(),獲取當天的所有成交記錄, 一個訂單可能分多次成交,返回一個dict, key是trade_id, value是Trade對象
get_current_data(security_list=None),獲取當天的開盤價、漲跌停價等,返回一個dict, key是股票代碼, value是當天的開盤價、漲跌停價等信息
Portfolio中,positions 當前持有的可賣出的股票, 返回一個dict, key是股票代碼, value是Position對象。 unsell_positions 當前持有的不可賣出的股票(比如T+1, 當前購票的股票), 一個dict, key是股票代碼, value是Position對象.
history,attribute_history,get_extras中,如果df=True, 返回pandas.DataFrame, 否則返回一個dict, key是股票代碼, 值是一個numpy數組numpy.ndarray, 對應上面的DataFrame的每一列。
具體可以在瀏覽器中按快捷鍵Ctrl + F,搜索“dict”,查看詳細幫助。