在Python里面有三种引用类型,分别为列表、元组和字典。我们本篇文章里只包含列表和元组的部分,字典由于使用广泛,我会单独使用一篇文章来讲解。从本篇文章开始,我们会比较侧重于实战的部分,因为事实上有了前面的Python的知识,已经足够可以开始写Python代码了。并且我一贯反对的就是看了两个星期的书和文档,还没有开始写代码,实践是最好的老师。
列表和元组其实本质上是一样的,我们前面已经讲过元组可以理解为不可修改的列表,元组的部分本文也不做大的篇幅来讲解。Python的列表可以进行很多的操作,包括索引、切片、相加、相乘、成员检查,并且可以很方便的进行排序、获得列表长度和找到最大最小值。
说了实战,那我们就来实战吧!我现在需要解决这样一个问题,有一个文件,里面存储的内容如下,我们将它里面的内容读出来,并且放到一个列表里面。没有放图,是方便大家拷贝。
date,open,high,low,close,volume,amount,factor19991110,29.5,29.8,27.0,27.75,174085000.0,4859102208.0,1.019991111,27.58,28.38,27.53,27.71,29403400.0,821582208.0,1.019991112,27.86,28.3,27.77,28.05,15007900.0,421591616.0,1.019991115,28.2,28.25,27.7,27.75,11921000.0,332952800.0,1.019991116,27.88,27.97,26.48,26.55,23223100.0,628908288.0,1.019991117,26.5,27.18,26.37,27.18,10052500.0,268995040.0,1.019991118,27.2,27.58,26.78,27.02,8446500.0,229577872.0,1.019991119,27.5,27.53,26.8,26.88,5374900.0,145887120.0,1.019991122,26.88,26.95,26.3,26.45,5535400.0,147086160.0,1.019991123,26.45,26.55,26.1,26.45,3843900.0,101224496.0,1.019991124,26.44,26.55,26.01,26.43,4098000.0,107344464.0,1.019991125,26.3,26.66,26.02,26.4,5725200.0,150528192.0,1.019991126,26.43,26.66,26.15,26.45,2282600.0,60508936.0,1.019991129,26.45,26.83,26.22,26.33,2681200.0,71099576.0,1.019991130,26.3,26.5,26.11,26.4,2371300.0,62335744.0,1.019991201,26.31,26.9,26.21,26.6,2865100.0,76287992.0,1.019991202,26.52,26.72,26.22,26.26,1938400.0,51110240.0,1.019991203,26.25,26.65,26.2,26.36,2552500.0,67291880.0,1.019991206,26.3,26.35,25.6,25.66,6983900.0,180516080.0,1.019991207,25.6,25.85,25.5,25.6,3955700.0,101467904.0,1.019991208,25.6,25.76,25.5,25.53,2236500.0,57214360.0,1.019991209,25.5,25.55,25.3,25.36,2564600.0,65136972.0,1.019991210,25.36,26.1,25.22,25.97,3553900.0,91041272.0,1.019991213,25.98,26.45,25.6,25.92,7058400.0,184655968.0,1.019991214,25.7,26.0,25.7,26.0,1618400.0,41845144.0,1.0
这个文件其实是一个csv格式的文件,我们可以用Python中Excel的包来进行读写,或者直接用Pandas包,但是我们今天不这么干,因为我们今天要讲解的是列表,所以我把它当作一个普通文件来进行读写。
其实在这种媒体上放代码放图片是最方便的,并且格式都比较能保留,但是为了方便大家Copy,还是直接代码写在这里,还是老惯例,我使用四个‘-’来表示一个缩进。言归正传,我们可以看到这个文件里面其实是一个Excel格式的数据,它有八列数据,分别为“Date”、“Open”、“High”、“Low”、“Close”、“Volume”、“Amount”、“Factor”。聪明的同学们已经猜到了,这是一只股票的OHLCV数据,多出了日期、成交额和复权因子。下面我们来读这个文件:
file_path = 'ohlcv.txt'stockList = []with open(file_path) as f: # 打开文件,f为文件句柄----lines = f.readlines() # 将文件内容全部读出----print(lines)
我们可以看到打印结果为一个列表:
['date,open,high,low,close,volume,amount,factor', '19991110,29.5,29.8,27.0,27.75,174085000.0,4859102208.0,1.0', '19991111,27.58,28.38,27.53,27.71,29403400.0,821582208.0,1.0',......'19991210,25.36,26.1,25.22,25.97,3553900.0,91041272.0,1.0', '19991213,25.98,26.45,25.6,25.92,7058400.0,184655968.0,1.0', '19991214,25.7,26.0,25.7,26.0,1618400.0,41845144.0,1.0']
由于篇幅关系我们只打印了开头和结尾的三行,我们可以看到每一行仍然是一个字符串的形式,并且结尾有换行符。那么我们将我们的程序稍作改写,对每一行进行一下处理。其中对于字符串可以用replace将换行去掉,而以逗号去做split则可以将以逗号分隔的字符串转为列表。
file_path = 'ohlcv.txt'stockList = []with open(file_path) as f:----stockList = f.readlines()----stockList = [line.replace('', '').split(',') for line in stockList]----print(stockList)
这次我们可以看到结果变为:
[['date', 'open', 'high', 'low', 'close', 'volume', 'amount', 'factor'], ['19991110', '29.5', '29.8', '27.0', '27.75', '174085000.0', '4859102208.0', '1.0'], ['19991111', '27.58', '28.38', '27.53', '27.71', '29403400.0', '821582208.0', '1.0'],......['19991210', '25.36', '26.1', '25.22', '25.97', '3553900.0', '91041272.0', '1.0'], ['19991213', '25.98', '26.45', '25.6', '25.92', '7058400.0', '184655968.0', '1.0'], ['19991214', '25.7', '26.0', '25.7', '26.0', '1618400.0', '41845144.0', '1.0']]
我们可以看到这基本上比较符合我们的期望了,这样我们可以很方便的来处理数据了。我们可以进行一系列的如下操作:
----print(stockList[0]) # 列表名信息
----print(stockList[1:] # 除了列表名的所有数据
----print(stockList.append(['19991214', '25.7', '26.0', '25.7', '26.0', '1618400.0', '41845144.0', '1.0']) # 添加一行数据
from collections import Counter
----print(Counter(stockList[1]) == Counter(stockList[2])) # 可以用这种方法来测试是否有重复数据行
在上面的操作中,我们完成了索引、切片和添加元素,本文例子中我们的列表的元素也是一个列表。下面如果我想得到所有的开盘价,该怎么操作呢?其实我们前面就已经有提过:
----stockListT = list(zip(*stockList))----print(stockListT )----print(list(stockListT[1])[1:])
我们可以看到其结果为:
[('date', '19991110', '19991111', '19991112', ......),('open', '.....)]
由于结果过长,我们省略了部分打印结果,我们可以看到zip出来的结果是tuple,那么tuple其实和列表的操作是一样的,我们可以通过list()来将其转换为列表。经过一个切片[1:],我们就获得了所有的开盘价。如果我们要得到开盘价和最高价,怎么做呢?
print(stockListT[1:3,:])print(stockList[:,1:3])
我们可以看到二维的列表切片也是非常方便的,我们还可以用max()、min()和sorted()对列表进行求最大、最小值和排序。
print(max(stockListT[1,1:]))print(max(stockListT[1,1:]))print(sorted(stockListT[1,1:]))
到此为止,基本上我们对列表和元组的使用应该有了一个认识了。大家可以在评论区留言,希望获得怎样的结果或者希望知道某种操作怎么做,一切问题可以在下面提出。