![商品期货量化交易实战:以Python为工具](https://wfqqreader-1252317822.image.myqcloud.com/cover/372/43738372/b_43738372.jpg)
2.6 Python中的列表和字典
列表和字典都是Python中的常用数据结构,列表是有序数据的集合,字典是无序数据的集合。列表中的每个元素都有其相应的索引值,字典中的每个元素都包含键值对。
2.6.1 列表索引
列表是Python中的基本数据结构,列表中的每个元素都有一个索引值,用于标记列表中元素的位置,第1个元素的索引值为0,第2个元素的索引值为1,以此类推。列表中的元素可以是不同类型的数据,示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_56_2.jpg?sign=1739248752-jcHYUHLvx5QSpo3I6nwRkNhBI7DRgIqD-0-fdf6a209a47ae994c784d1780e672fad)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_56_3.jpg?sign=1739248752-2IOXQznfl2KNMPZJIJfYEoJLyybaZZFM-0-de5599eb72eb1cd423aaf181e386d6ad)
在上述代码中,首先定义了一个二维列表变量,然后通过列表索引获取其中的元素,当索引值为0时,获取该列表变量中的第1个元素;当索引值为1时,获取该列表变量中的第2个元素;以此类推。
2.6.2 列表切片
通过列表切片,可以获取列表中的部分元素。列表切片与字符串切片类似,也需要遵循左闭右开的原则,即从“起始”位开始,到“结束”位的前一位结束(不包含结束位本身)。最后一个元素的索引值是-1。也可以用len()函数获取列表中的元素个数。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_57_1.jpg?sign=1739248752-cBKRrbNAwVdjvdJjdMDFwbtynoLA49Oi-0-6f80eaf7741ca4dcecfa8d4332e9924d)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_57_2.jpg?sign=1739248752-GqJKBWJUirNQZGxV9DlgNHWykaSuOGLG-0-f8673513822dc80673bfe8cb33c46a2d)
列表切片与字符串切片的使用方法一致。在上述代码中,首先定义了一个列表变量,在列表变量后面添加“[1:3]”,表示获取该列表变量中索引值为1~2的元素,即获取列表变量中的第2~3个元素;在列表变量后面添加“[-1]”,表示获取该列表变量中的最后一个元素。
2.6.3 列表中元素的修改与删除
列表是可变的数据类型,列表中的元素可以被修改、删除。直接使用赋值操作符就能修改列表中的元素值。例如,将列表中索引值为1的元素值修改为22(原本是2),代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_57_3.jpg?sign=1739248752-7XGHb7oFWEv2IINTi3tBufLVLM60ywdC-0-63d8343c5016f7b957b78ab52c12c2ca)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_57_4.jpg?sign=1739248752-cx7smDiIxSU0B7lcFIc277xwpWpOx3qx-0-f3750618426de0c0b77c91c1eb51e976)
Python提供了4种用于删除列表中元素的方法,分别为del关键字、pop()函数、remove()函数、clear()函数,不同的方法适用于不同的场景。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_57_5.jpg?sign=1739248752-bXb0hYT2GwpKXgMEEF3HDChlH6vfMt1k-0-681d3d509c1bbcbdc303de68f839898d)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_58_1.jpg?sign=1739248752-wDclFL9M5bVg5IwYBpJKnJodtsSgyXJu-0-1ae23a7781acbe90aa912c820949a69a)
在上述代码中,首先使用del关键字删除了列表中索引值为1的元素“2”,然后使用pop()函数删除列表中的最后一个元素,接着使用remove()函数删除列表中值为“5”的元素,最后使用clear()函数删除列表中的所有元素。
2.6.4 二维列表
列表中的元素可以是任意一种数据类型,包括列表。如果一个列表中包含列表,那么这个列表就是二维列表。在量化交易中心,二维列表通常在技术指标中使用。获取二维列表中列表元素中元素的示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_58_2.jpg?sign=1739248752-mbXnLNO0a7eO1CCqQz1RAX6fZaxL7yMn-0-0bf10dddb73c79c7426cf362a1828e8b)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_58_3.jpg?sign=1739248752-IL5249JDTBEOcbDwwSpONn07W2apNM05-0-29197a0e370debc684895cdf4e7a2597)
MACD指标一共有3个数据,分别为dif线、dea线、macd量柱。如果使用talib库中的MACD指标计算MACD的值,则会返回一个二维列表。该二维列表中的第1个元素是MACD指标中dif线的数据,第2个元素是MACD指标中dea线的数据,第3个元素是MACD指标中macd量柱的数据。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_58_4.jpg?sign=1739248752-vtdQLWJI69VYFCaR5Ok5OPHpQ3Ve2RJW-0-861ecc50713ef63137ab0b76b4a6cd5b)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_58_5.jpg?sign=1739248752-IZDCdrvEyG8uM0cZhPjKByHZBlTSolql-0-08ddf91b70b0422598e0812780e19211)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_59_1.jpg?sign=1739248752-0RDC2Dq669zsjQW3qp6CEylWbooJHwys-0-89780e84d771a73e386a65a5eb8b20b0)
在上述代码中,首先定义了一个二维列表变量macd,该变量中一共有3个元素,第1个元素是dif线的数据,第2个元素是dea线的数据,第3个元素是macd量柱的数据。并且每个元素都是列表,如果要获取最新的dif值(dif线的数据中的倒数第1个元素值),那么macd的索引是“[0][-1]”。
2.6.5 列表中元素的增加
在Python中,append()函数主要用于向列表尾部追加元素,如果所追加的元素是个列表,那么这个列表会作为一个整体进行追加。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_59_2.jpg?sign=1739248752-hYUv1aEUHRFACGbhwTtf3XktX9uDgodG-0-03602d63ea49ce3b09cec9e1b47952b6)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_59_3.jpg?sign=1739248752-HkpWcuvSuehpOIGKm9HVj5k1eDNTWOY5-0-ede14ac99c36e9d9e6e2bf8400b33b2a)
注意:在列表中增加元素后,列表的长度会自动增加。
2.6.6 列表反向排序
reverse是列表中的一个非常实用的内置函数,它可以让列表中的元素反向排序,该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_59_4.jpg?sign=1739248752-5DdgBUeErV6cDiBhIO58yPdejs56RT2t-0-cb21e6ce26c1c83a4891bdc3dac51d2a)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_59_5.jpg?sign=1739248752-LxSSDOQcGnAuo53HbaDeg9bJcUkNwjWL-0-6e11f1fdb88d14dff196ac626de87f93)
在上述代码中,首先定义了一个列表变量arr=[1,2,3,4],然后调用了该列表变量的reverse()函数,对该列表变量中的元素进行反向排序,输出结果为[4,3,2,1]。
2.6.7 创建字典
字典中的元素可以是任意数据类型的数据,字典中的键名(key)和键值(value)是一一对应的,对应的一对键名和键值称为键值对。在键值对中,键名是数据的名字,键值是数据。字典使用英文冒号“:”分隔键值对中的键名和键值,键值对之间用英文逗号“,”分隔,整个字典用花括号“{}”包裹起来。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_60_1.jpg?sign=1739248752-w2HxXg9ADthI4ZfmPsZIvFXsfkP1QJJf-0-d3df375c9c1bac706587d644c003a012)
字典中的键名必须是唯一的,键值可以是重复的。键值可以是任何数据类型的数据,但是键名必须是不可变数据类型的数据,如数值、字符串都可以作为键名。字典的创建方法很简单,示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_60_2.jpg?sign=1739248752-LatKTor8UOWJ8TI7OrKSQeRFL8ZLZ15b-0-07599bdf2971a3868f9daacd5a937517)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_60_3.jpg?sign=1739248752-fHN6OW7iFrwVw4G0AedTdEhHHuryFkwu-0-aa3ae8d5e1c276fa573c95f251f8c536)
在上述代码中,首先定义了一个字典,并且将其赋给boy变量,然后使用Log()函数输出字典变量boy,在日志中会显示字典变量boy中的键值对。
2.6.8 访问字典中的键值
汉语字典可以通过拼音查汉字,Python字典访问基于这个原理,可以通过键名(key)访问字典中的键值(value)。具体方法为,在字典变量名后面写方括号“[]”,然后在方括号内写要访问的键值对应的键名。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_60_4.jpg?sign=1739248752-XxgPN04xWVEbEb7su0yCzAOqmPrgHa77-0-afd7f7c5fff5d822a5aae383e8bcb310)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_61_1.jpg?sign=1739248752-p8ojWiIrM0xqnA2W2ztG2pR2AErD2n7O-0-791881ea358dc6f801cc752930c36883)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_61_2.jpg?sign=1739248752-Zj4LaCbc9knmWP4hSlDasLlyQSUo2hyj-0-81a362b496d656a0c95b260a8f8509d5)
注意:在访问字典中的键值前,需要先判断字典中是否包含该键值对,如果访问的字典中并不存在该键值对,那么程序会报错。
2.6.9 字典中元素的增加与修改
字典是可变数据类型的数据,也就是说,可以对字典中的元素进行增加、删除、修改、查询操作。如何增加和修改字典中的元素呢?和访问字典中键值的方式一样,只不过是对其进行赋值操作。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_61_3.jpg?sign=1739248752-HKV5XYwiPiAhebzmzb97QkuAU3cPuSJQ-0-207be0270bb9083c9eb66a9447c3cc87)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_61_4.jpg?sign=1739248752-S6bMnWF0ktTnGrEt86YggNiEms0z1pdS-0-298ff0500a35e9cd32b63e8a2c57872c)
在上述代码中,首先创建了一个字典变量boy,该字典变量中包含3个键名,分别为"name"、"age"和"Email",由于字典变量boy中没有键名为"height"的键值对,因此创建了该键值对并为其赋值;由于字典中有键名为"Email"的键值对,因此更新该键值对的键值。
2.6.10 字典中元素的删除
Python中的字典有4种用于删除元素的方法,适用于不同的应用场景。其中del是全局方法,既能删除单个元素,又能删除整个字典,示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_61_5.jpg?sign=1739248752-pkhPpjp8dgPS2nlMBEHFgq3Yp6lOIA8B-0-c997c359ee4a9fdb70ac3980287a786a)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_62_1.jpg?sign=1739248752-m5q0YCa78CjS0zoOQ7CrZJZGwvaYH8xd-0-f6416e91d63521f5ac2006d93680343f)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_62_2.jpg?sign=1739248752-5Y9XhM5K6LaX8CkWcPxYZKKmKbJVLVFc-0-bd2677927fd3e94a0601cbe734ed4a17)
在上述代码中,首先创建了一个字典变量boy,然后删除了字典变量中的键名为"age"的元素(键值对),最后将字典变量boy删除了。如果del关键字后面跟的是一个字典名(del boy),那么删除的是整个字典(boy);如果del关键字后面跟的是字典名[键名](del boy["age"]),那么删除的是该字典中该键名对应的元素(键值对)。如果要清空字典中的所有元素,则可以直接调用字典的clear()函数,示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_62_3.jpg?sign=1739248752-GrKpiHqUm0tf6iI3uYzmwHDch97llJCD-0-7b0bdb14c1224c55b31c2d82d2cc3f68)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_62_4.jpg?sign=1739248752-xVL9AlF0VbubdTh9lJLslILJ9i4cQq3w-0-566612dd4db035f984798b1bce069b69)
注意:字典中的元素可以是任意数据类型的数据,但是字典中的键名必须是不可变数据类型的数据,并且字典中的键名不能重复,如果在创建一个字典时出现两次相同的键名,那么只会记录最后一个键名对应的键值对。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_62_5.jpg?sign=1739248752-PinjLXqH1zTwcDaJ4onyQRwsM65hCrQC-0-c9cf75ce54a2b381836a73580c681981)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_63_1.jpg?sign=1739248752-t5Dj9cbhoWfS3eaPBO0oqc9ombBnCL3f-0-79f970f1a3a43d0a3a2248432512e05d)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_63_2.jpg?sign=1739248752-KLGapxdrVwNzeB4Ki2U1JUWRT2V35fHh-0-2339d45bdafb3e8218469e8f1e5d08c1)
在上述代码中,创建了一个字典变量boy,但是在该字典变量中有两个键名为"name"的键值对(name元素),那么后面的键名"name"对应的键值(name元素的值)会覆盖前面的键名"name"对应的键值(name元素)。