请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3364712 新帖:0

Python入门(3)- 数据类型之字典

执着技术派发表于:5 月 21 日 13:00回复(1)

这是面向新用户的 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新增或修改键

字典用法注意事项:¶

  1. 序列运算无效,字典元素间是没有顺序的概念

  2. 对新索引赋值会添加项

  3. 键不一定总是字符串

字典键也常用于实现稀疏数据结构。例如,多维数组中只有少数位置上有存储的值:

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',
 'o': 'oooo',
 't': 'tttt',
 'u': 'uuuu'}
{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!',
 'q': 'QQQQ!',
 't': 'tttt!',
 'u': 'uuuu!'}

注意:¶

我们一般都很愿意使用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”,查看详细帮助。

 

全部回复

0/140

达人推荐

量化课程

    移动端课程