Python期货量化交易实战
上QQ阅读APP看书,第一时间看更新

技巧7 【操作】元组、列表与字典的应用

在Python中,没有矩阵这种数据类型,但是有元组、列表与字典这3种类型。其中,元组与列表很相似,都是用来存储数据的序列,也都支持多维的序列(矩阵);唯一不同之处就是元组在定义完成后,是不允许更改其内部值的,而列表可以更改其内部值。字典在对象中加上了索引值。

下面通过一个示例来介绍元组与列表的差异。

>>> x=[1,2,3]
>>> x[2]=4                  #列表对象可以被修改
>>> x
[1, 2, 4]
>>> x=(1,2,3)
>>> x[2]=4                  #元组对象无法被修改
TracebacK(most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment 

下面分别介绍3种对象的应用。

1.元组(tuple)

元组定义以后不得更改其内部元素。下面介绍元组的基本用法。

(1)定义元组

元组是用小括号来定义对象的,示例如下:

>>> x=(1,2,3,4,5,6)                 #定义一维的元组
>>> x 
(1, 2, 3, 4, 5, 6) 
>>> x=((1,2),(3,4),(5,6))           #定义二维的元组
>>> x 
((1, 2), (3, 4), (5, 6))

也可以在一行中定义多个变量,示例如下:

>>> x,y = (1,2,3),(3,4,5)
>>> x 
(1, 2, 3) 
>>> y 
(3, 4, 5)

(2)删除元组变量

通过del可以删除元组,示例如下:

>>> x=((1,2),(3,4),(5,6))
>>> x 
((1, 2), (3, 4), (5, 6)) 
>>> del x 
>>> x 
TracebacK(most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'x' is not defined

(3)访问元组

在Python元组对象中,索引值都是从0开始的。访问元组的示例如下:

>>> x=((1,2),(3,4),(5,6))
>>> x
((1, 2), (3, 4), (5, 6))
>>> x[0] 
(1, 2)
>>> x[0][0] 
1

(4)元组计算

元组计算是指将元组进行组合或复制。若要进行数值计算,则需取出元组内的值再进行计算,示例如下:

>>> x=(1,2,3)
>>> y=(7,8,9)
>>> x+y                    #两个元组组合
(1, 2, 3, 7, 8, 9)
>>> x*3                    #元组倍数复制
(1, 2, 3, 1, 2, 3, 1, 2, 3)

(5)在函数中的应用

元组也可以用于max、min函数中,示例如下:

>>> x
(1, 2, 3)
>>>
>>> max(x)
3
>>> min(x)
1

(6)在判断中的应用

Python提供了in指令,用来判断该元素是否在tuple中,示例如下:

>>> x
(1, 2, 3) 
>>> 3 in x 
True 
>>> 4 in x 
False

(7)在循环中的应用

Python的元组对象可以直接用来进行循环计算。用户可以利用这个特性来编写程序代码,示例如下:

>>> x
(1, 2, 3) 
>>> for i in x: 
...     print (i) 
... 
1
2
3

2.列表(list)

列表是Python中定义列表的语法。与元组的不同在于,列表可以变更内部元素值。下面介绍list的基本用法。

(1)定义列表

列表是用中括号来定义对象的,示例如下:

>>> x=[1,2,3,4,5,6]
>>> x 
[1, 2, 3, 4, 5, 6] 
>>> x=[[1,2],[4,5],[7,8]] 
>>> x 
[[1, 2], [4, 5], [7, 8]]

也可以在一行中定义多个列表变量,示例如下:

>>> x,y=[1,2,3],[6,7,8]
>>> x 
[1, 2, 3] 
>>> y 
[6, 7, 8]

(2)删除列表变量

通过del可以删除列表,示例如下:

>>> x=[[1,2],[4,5],[7,8]]
>>> x
[[1, 2], [4, 5], [7, 8]]
>>> del x
>>> x
Traceback(most recent call last): 
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

(3)访问列表

在Python列表对象中,列表的索引是从0开始的。下面介绍如何访问列表,示例如下:

>>> x
[1, 2, 3]
>>> x[0]
1
>>> x[:2]
[1, 2]
>>> x=[[1,2],[4,5],[7,8]]
>>> x[0][0]
1
>>> x[1][1]
5

(4)计算列表

这里所指的计算是将列表组合或复制。若要进行数值计算,则需先取出列表内的值再进行计算,操作如下:

>>> x,y=[1,2,3],[6,7,8]
>>> x+y
[1, 2, 3, 6, 7, 8]
>>> x*3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

(5)函数应用

由于可以更改列表的元素,因此可以使用相对较多的函数。

① append函数可以将参数添加到列表的尾部,示例如下:

>>> x=[45,72,65,21,87]
>>> x 
[45, 72, 65, 21, 87] 
>>> x.append(100) 
>>> x 
[45, 72, 65, 21, 87, 100]

② count函数可以计算该值在列表中的个数,示例如下:

>>> x
[45, 72, 65, 21, 87, 100] 
>>> x.count(5) 
0
>>> x.count(65) 
1

③ extend函数可以将多个列表汇总起来,示例如下:

>>> x
[45, 72, 65, 21, 87, 100] 
>>> 
>>> x.extend([44,55]) 
>>> x 
[45, 72, 65, 21, 87, 100, 44, 55]

④ index函数可以获取特定元素在列表当中的位置,示例如下:

>>> x
[45, 72, 65, 21, 87, 100, 44, 55] 
>>> x.index(65) 
2
>>> x.index(100) 
5

⑤ remove函数可以删除列表里面的特定元素,示例如下:

>>> x
[1, 2, 3, 4, 5] 
>>> x.remove(4) 
>>> x
[1, 2, 3, 5]

⑥ reverse函数可以将整个列表的内容反转,示例如下:

>>> x
[1, 2, 3, 5]
>>> x.reverse()
>>> x
[5, 3, 2, 1]

⑦ sort函数可以将整个列表按照从小到大的顺序排序,示例如下:

>>> x
[5, 3, 2, 1]
>>> x.sort()
>>> x
[1, 2, 3, 5]

(6)在判断中的应用

Python提供了in指令,可以判断该元素是否在列表中,示例如下:

>>> x=[1,2,3,4,5,6,7]
>>> 5 in x
True
>>> 8 in x
False

(7)在循环中的应用

Python的列表对象可以直接用来进行循环计算。用户可以利用这个特性来编写程序代码,示例如下:

>>> x=[1,2,3,4,5,6,7]
>>> sum=0
>>> for i in x:
...     sum+=i          #缩进
...
>>> sum
28

(8)列表解析式

列表解析式能够通过简短的程序代码,将一个列表转换为另一个列表。简单来说,有点像在取该列表的子集合,但又不全然如此。在列表解析式中还可以进行栈位的判断、计算,实际上可以实现的功能相当多。

从操作上来说,就是通过循环来进行列表的判断和计算,但列表解析式不需要通过换行就可以实现循环。但就功能上来说,还是有某些限制,例如不能在列表解析式中进行嵌套循环。

列表解析式常用于读取文件、数据筛选等。示例如下:

>>> content = [ line for line in open('Futures_20170815_I020.csv')]   #读取文件内容
>>> content[1:10] 
['8450010,8450009,TXFH7,128,10310,732,732,202,349\n', '8450011,8450010,TXFH7,128, 
10309,4,736,206,350\n', '8450011,8450010,TXFH7,128,10309,1,737,207,351\n', 
'8450011,8450010,TXFH7,128,10310,1,738,208,352\n', '8450011,8450010,TXFH7,128, 
10310,1,739,209,353\n', '8450011,8450010,TXFH7,128,10309,2,741,210,354\n', 
'8450011,8450011,TXFH7,128,10309,1,742,211,355\n', '8450013,8450011,TXFH7,128, 
10310,1,743,212,356\n', '8450013,8450011,TXFH7,128,10310,1,744,213,357\n'] 
>>> I020 = [ line.strip('\n').split(",") for line in content][1:] 
>>> I020[1:10] 
[['8450011', '8450010', 'TXFH7', '128', '10309', '4', '736', '206', '350'], 
['8450011', '8450010', 'TXFH7', '128', '10309', '1', '737', '207', '351'], 
['8450011', '8450010', 'TXFH7', '128', '10310', '1', '738', '208', '352'], 
['8450011', '8450010', 'TXFH7', '128', '10310', '1', '739', '209', '353'], 
['8450011', '8450010', 'TXFH7', '128', '10309', '2', '741', '210', '354'], 
['8450011', '8450011', 'TXFH7', '128', '10309', '1', '742', '211', '355'], 
['8450013', '8450011', 'TXFH7', '128', '10310', '1', '743', '212', '356'], 
['8450013', '8450011', 'TXFH7', '128', '10310', '1', '744', '213', '357'],
['8450013', '8450012', 'TXFH7', '129', '10310', '2', '749', '214', '362']]

注:在读取文件内容时,本示例所引用的csv文件位于C:\Python37,若读者将csv文件保存于其他位置,请在代码中加入csv文件的存储路径。

3.字典(dictionary)

字典是带有索引的列表,在每个值之前都会加上索引,所以大多数操作都会通过索引来进行取值。

(1)定义字典

字典用大括号来定义,示例如下:

>>> x={'one':123,'two':345,'three':567}
>>> x 
{'one': 123, 'two': 345, 'three': 567}

(2)删除字典变量

用del可以删除字典,示例如下:

>>> x
{'one': 123, 'two': 345, 'three': 567}
>>> del x
>>> x
Traceback(most recent call last): 
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

(3)访问字典

基于字典的存储结构只能通过index访问,示例如下:

>>> x={'one':123,'two':345,'three':567}
>>> x
{'one': 123, 'two': 345, 'three': 567}
>>> x['one']
123
>>> x['three']
567
>>> x[0] 
Traceback(most recent call last): 
  File "<stdin>", line 1, in <module>
KeyError: 0

(4)函数应用

① len函数可以查看字典对象的长度,示例如下:

>>> x
{'one': 123, 'two': 345, 'three': 567}
>>> len(x)
3

② copy函数可以复制相同的字典对象,示例如下:

>>> x.copy()
{ 'one': 123, 'two': 345, 'three': 567}

③ clear函数可以清除字典对象,示例如下:

>>> x.clear()
>>> x
{}

④ items函数可以将字典转换成list对象,示例如下:

>>> x.items()
dict_items([('one', 123), ('two', 345), ('three', 567)])