从上节学习过字符串后,心中就在思考,想要存储多个字符串怎么办?C中有数组可以实现上述功能,那python呢?现在就让我们来一探究竟吧。python中提供了一种神奇的数据类型list,他有多神奇呢,大家先不要急,让我婉婉到来,茶要慢慢品嘛。
list是一种有序的集合,可以随时对他进行增减等操作。比如需要列出小组里所有组员的名字:
>>>group = [ 'Liming' , 'Wanghai' , 'Zhangfang' ];
>>>print( group );
[ 'Liming' , 'Wanghai' , 'Zhangfang' ]
看到中括号'[]'是不是感觉很像数组?别急,python中还给我们提供了元组'()'和字典'{}',这些都会在后面一一描述。
那么,既然list很像数组,他的索引又是从哪里开始的呢?上述group中又有几个元素呢?
>>>len( group );
3
>>>group[0];
'Liming'
>>>group[0];
'Zhangfang'
可以看出,list的索引是0到len( group )-1。下面就是python中名为切片的有意思的地方了,如果你用过matlab的话,你可能会说,“哎呀,这不就是matlab数组的用法嘛”;如果没有的话,你可能会说,“还有这么神奇的用法”。那么就让我们一起来看一看吧。
>>>group[-1];
'Zhangfang'
>>>group[-3];
'Liming'
>>>group[:];
[ 'Liming' , 'Wanghai' , 'Zhangfang' ]
>>>group[::];
[ 'Liming' , 'Wanghai' , 'Zhangfang' ]
>>>group[::-1];
[ 'Zhangfang', 'Wanghai' , 'Liming' ]
list支持倒序查找元素,如-1找到的就是最后一个元素,而-len( group )-1就是第一个元素了。对于省略参数的类型,例如group[::]等效于group[0:len(group)+1:1](第二个冒号省略默认步长为1),而group[::-1]代表的就是group[-1:-len(group)-1:-1];其中第二个':'后面的±1代表了步长。也许细心的你会问为什么第一个‘:’后面的±len(group)都要±1呢?
这是因为对于python来讲[ x : y ]相当于只有y-x个元素,例:
>>>group[0:2];
[ 'Liming' , 'Wanghai' ]
>>>group[-1:-3:-1];
[ 'Zhangfang', 'Wanghai' ]
注意:当省略步长时,步长默认为1。
而对于字符串类型,同样支持切片操作,不过是返回的是某些字符而已了,如下所示:
# -*- coding: utf-8 -*-
name = 'Mecial';
print(name[0])
print(name[-1:-3:-1])
list集合的增删改查
>>>group.insert( 1 , 'Chensen' );
>>>group
[ 'Liming' , 'Chensen' , 'Wanghai' , 'Zhangfang' ]
>>>group.pop( 0 );
'Liming'
>>>group
[ 'Chensen' , 'Wanghai' , 'Zhangfang' ]
>>>group[0] = 'Liming' ;
>>>group
[ 'Liming' , 'Wanghai' , 'Zhangfang' ]
从上面可以看出insert()方法可以在指定索引位置插入元素,pop()方法可以删除指定索引位置的元素,还可以通过直接赋值的方法对指定索引位置的元素进行更改。怎么样,是不是很像matlab呢?
那么,既然python是一个动态语言,是否也就意味着list中的元素可以是不同类型的数据呢,让我们来实验一下:
>>>group[2] = 20180323;
>>>group
[ 'Liming' , 'Wanghai' , 20180323 ]
看,完美的赋值。C等语言中有二维数组,python的list是否也有类似的结构呢?
>>>team = [ 'Zhangfang' , 'Chensen' ];
>>>group[2] = team ;
>>>group
['Liming','Wanghai',['Zhangfang' ,'Chensen']]
>>>len(group)
3
>>>group[2][1]
'Chensen'
可以看到,group中放置了team,从而构成了"二维数组",但group的长度仍然是3。
元组tuple()
有一种有序的数组叫做tuple,他跟list极其相似,但是有需要注意的是元组()一旦被初始化后就不能再改变!!!其他的读取都跟list[]相同。有一点需要注意的是,当定义只有一个元素的元组时会发生以下的情况
>>>test_tuple = (1);
>>>test_tuple
1
>>>test_tuple = (1,);
>>>test_tuple
(1,)
对于python来讲,()默认为是数学上的括号,而不是tuple中的(),因此需要对其加一个逗号','同样的,tuple也会输出一个','以免造成误解。
字典dict{}
dict全称dictionary,由于使用键值(key-value)存储,因而有着极快的查找速度。当需要存储一个人的名字和年龄时,如果用列表就需要两个list分别存储名字和年龄;这样当需要查找某一个人的年龄时就需要先通过一个list查找其名字所在的索引,然后根据索引值再去查找存放在另一个list中的年龄,当数据量比较大的时候,复杂度可想而知。因此,通过键值(key-value)存储的dict就有着巨大的优越性,下面让我们一起来看一看dict的存储。
name_age = { 'Liming' : 18 , 'Wanghai' : 22 , 'Zhangfang' : 36 }
name_age['Liming']
print( name_age['Liming'] )
for n in name_age:
print(name_age[n])
print(n)
输出为:
18
18
Liming
22
Wanghai
36
Zhangfang
可以看出对于name_age,传入的是key而不是索引位置,否则会报错!!!