一.列表:
1.1——基础介绍
数组(Array)是由有限个元素组成有序集合,用序号进行索引。事实上,列表就类似数组这个数据结构,它为每个元素分配了一个序号。在Python中,将这种有顺序编号的结构称之为“序列”,序列主要包括:列表、元组、字符串等
字符串的声明是在“ ”或者‘ ’内的,对于列表,它的声明形式为:L=[ ],执行这条语句时,将产生一个空列表。列表中的元素以“,”相间隔,例如,语句L=[1,3,5]定义了一个含有三个元素的列表。元素之间用‘,’相间隔。
注意,不同于数组,列表中的元素类型可以是不一样的,列表中的元素可以是整数型,浮点型,字符串,还可是列表。
例如,L=[1,1.3,’2’,”China”,[‘I’,’am’,’another’,’list’]]。
这在对列表元素进行操作时,一定要注意元素类型,例如上述的L,如L[0]+L[2]操作将产生错误,因为整数型不能与字符串相加,而str(L[0])+L[2],与L[0]+int(L[2])都是正确的,不过第一个表达式得到的结果为“12”,而第二个结果为3。
序号 | 操作符 | 说明 |
1 | seq[index] | 获得下标为index 的元素 |
2 | seq[index1:index2(:stride)] | 获得下标从index1 到index2 间的元素集合,步长为stride |
3 | seq1 + seq2 | 连接序列seq1 和seq2 |
4 | seq * expr | 序列重复expr 次 |
5 | obj in seq | 判断obj 元素是否包含在seq 中 |
序列中的所有元素都是有索引号的(注意:索引号是从 0 开始递增的)。这些元素可以通过索引号分别访问。
这时,就可以使用下标操作符“[index]”来获取,index称之为下标。
#<程序:序列索引>
L=[1,1.3,"2","China",["I","am","another","list"]]
print(L[0])
>>>1
当索引值为负数时,它表示从序列最后一个元素开始计数。
注意,如果下标值超出了序列的范围,Python解释器将会报错,提示下标超出范围。比如,该L的合法范围是[-5, 4]。
Python对序列提供了强大的分片操作,运算符仍然为下标运算符,而分片内容通过冒号相隔的两个索引来实现。例如,L[index1:index2]:index1是分片结果的第1个元素的索引号,其遵循左闭右开。
如果index2≤index1,那么分片结果将为空串。
如果index2置空,分片结果将包括索引为index1及之后的所有元素。
如果index1置空,表示从序列开头0到index2的分片结果。而当index1与index2都置空时,将复制整个序列,例如L[:]
分片操作的形式还可以是L[index1:index2:stride],第三个数stride是步长,在没有指定的情况下,默认为1。如果步长大于1,那么就会跳过某些元素,
如,要得到L的奇数位的元素时,L[::2]即可实现。
注意,步长不能为0,但可以为负数,表示从右向左提取元素。
例如,L[-1:-1-len(L):-1]会产生最后一个元素开始往前到第一个元素的序列,len(L)函数是返回序列L的长度。
注意,分片操作是产生新的序列,不会改变原来的序列。
两个整数类型相加是整数值做加法,而对于两个序列,加法则表示连接操作,需要注意的是,进行操作的两个序列必须是相同类型(字符串、列表、元组等)才可以进行连接。
序列的乘法表示将原来的序列重复多次。
例如L=[0]*100会产生一个含有100个0的列表。这个操作对初始化一个有足够长度的列表是有用的。
序号 | 函数 | 说明 |
1 | len(seq) | 返回序列seq的元素个数 |
2 | min(seq) | 返回序列中的"最小值" |
3 | max(seq) | 返回序列中的"最大值" |
4 | sum(seq[index1:index2]) | 序列求和。(注:字符串类型不适用) |
列表还有额外的很多方法(method),这里的方法事实上与函数是一个概念,不过,它是专属于列表的,其他的序列类型是无法使用这些方法的。这些专用方法的调用方式与通用序列函数调用方式不同。
参数中的[]符号表示该参数可以传递也可以不传递。
如s.pop(),若不传递参数,s将最后一个元素弹出,否则s.pop(i)将弹出s中第i号位置的元素。
例:s=[1,2]
函数 | 作用/返回 | 参数 | s结果/返回 | |
1 | s.append(x) | 将一个数据添加到列表s的末尾 | '3' | [1,2,'3'] |
2 | s.clear() | 删除列表s的所有元素 | 无 | [] |
3 | s.copy() | 返回与s内容一样的列表 | 无 | [1,2]/[1,2] |
4 | s.extend(t) | 将列表t添加到列表s的末尾 | ['3','4'] | [1,2,'3','4'] |
5 | s.insert(i, x) | 将数据x插入到s的第i号位置 | 0,'3' | ['3',1,2] |
6 | s.pop(i) | 将列表s第i个元素弹出并返回其值 | 1或无 | [1]/2 |
7 | s.remove(x) | 删除列表s中第一个值为x的元素 | 1 | [2] |
8 | s.reverse() | 反转s中的所有元素 | 无 | [2,1] |
1.2 列表——遍历
遍历,即要依次对列表中的所有元素进行访问(操作),对列表这种线性数据结构最自然的遍历方式就是循环。
#<程序:for循环对列表进行遍历>
L = [1,3,5,7,9,11]
for e in L:
e+=1
print(e)
#<程序:while循环对列表进行遍历>
L = [1,3,5,7,9,11]
mlen = len(L)
i =0
while(i<mlen):
print(L[i]+1)
i += 1
while循环:
其一般格式如下:首行会对一个bool变量<test1>进行检测,下面是要重复的语句块<语句块1>,在执行完<语句块1>后重新回到while首行检查<test1>的值。最后有一个可选的else部分,如果在循环体中没有遇到break语句,就会执行else部分,即<语句块2>。
while<test1>:
<语句块1>
else:
<语句块2>
for循环:
其一般格式如下:首行会定义一个赋值目标<target>,in后面跟着要遍历的对象<object>,下面是想要重复的语句块。同while循环,for循环也有一个else子句,如果在for循环的结构体中没有遇到break语句,那么就会执行else子句。
for <target> in <object>:
<语句块1>
else:
<语句块2>
另外用range()函数也可以产生遍历的索引,其也遵循左闭右开
可以用list(range(0:x))来产生一个从0开始到x-1的列表[0,1,2,…,x-1]。
二.字符串
同列表一样,字符串也实现了序列的通用操作与函数。
注意:字符串内容是不可改变(immutable变量)。
字符串对某一个索引所在位置进行赋值是不允许的,例如,s = “Hello world?”,想要将”?”改为”!”,如果使用s[11]=’!’,这是不允许的。
另外,在列表中,一个列表变量调用自己的专用方法,将反应到列表本身,但在字符串中,调用其自己的专用方法,其自身的内容是不变的。
在参数中的[ ]表示调用方法时,该参数可以传递也可以省略。
函数 | 作用/返回 | 参数 | print结果 | |
1 | str.capitalize() | 首字母大写,其它小写的字符串 | 无 | Hello |
2 | str.count(sub[, start[, end]]) | 统计sub字符串出现的次数 | 'O' | 1 |
3 | str.isalnum() | 判断是否是字母或数字 | 无 | TRUE |
4 | str.isalpha() | 判断是否是字母 | 无 | TRUE |
5 | str.isdigit() | 判断是否是数字 | 无 | FALSE |
6 | str.strip([chars]) | 开头结尾不包含chars中的字符 | 'HEO' | 'll' |
7 | str.split([sep], [maxsplit]) | 以sep为分隔符分割字符串 | 'll' | ['HE','O'] |
8 | str.upper() | 返回字符均为大写的str | 无 | HELLO |
9 | str.find(sub[, start[, end]]) | 查找sub第一次出现的位置 | 'll' | 2 |
10 | str.replace(old, new[, count]) | 在str中,用new替换old | 'l','L' | HELLO |
#str.capitalize():将字符串的第一个字母变成大写,其他字母变小写。
>>>s = 'a, B’
>>> print(s.capitalize())
'A, b’
>>> s = ' a, B' # a 前面有空格
>>> print(s.capitalize())
' a, b’
>>> s = ‘a, BCD’
>>>print(s.capitalize())
'A, bcd'
'''Str.count() 用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。
str.count(sub, start= 0,end=len(string))'''
str = "abcdefgsdafdfagda"
print(str.count("d", 2, 15))
>>3
#表示统计str中索引为2和14位置’d’出现的次数。
#str.isalnum():检测字符串是否由字母和数字组成。
>>>str = "this2009";
>>>Print( str.isalnum());
True
>>>str = "this is string example....wow!!!";
>>>print(str.isalnum());
False
#str.isalpha():检测字符串是否只由字母或文字组成。
>>>str = "runoob"
>>>print (str.isalpha())
True
>>>str = "runoob菜鸟教程”
>>>print (str.isalpha())
True
>>>str = "Runoob example....wow!!!”
>>>print (str.isalpha())
False
#str.isdigit():检测字符串是否只由数字组成。
>>>str = "123456"
>>>print (str.isdigit())
True
>>>str = "Runoob example....wow!!!”
>>>print (str.isdigit())
False
#str.strip([chars]):用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列.
>>>str = "00000003210Runoob01230000000";
>>>Print( str.strip( '0' )); # 去除首尾字符 0
3210Runoob0123
>>>str2 = " Runoob "; # 去除首尾空格
>>>Print( str2.strip( ));
Runoob
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
'''str.split([sep], [maxsplit]):通过指定分隔符对字符串进行切片,如果第二个参数 maxsplit 有指定的值,则分割为 maxsplit +1 个子字符串。
sep -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
maxsplit -- 分割次数。默认为 -1, 即分隔所有。'''
>>>str = "this is string example....wow!!!"
>>>print (str.split( )) # 以空格为分隔符
>>>print (str.split('i',1)) # 以 i 为分隔符 ,分割一次
>>>print (str.split('w')) # 以 w 为分隔符
['this', 'is', 'string', 'example....wow!!!’]
['th', 's is string example....wow!!!’]
['this is string example....', 'o', '!!!']
#str.upper():将字符串中的小写字母转为大写字母。
>>>str = "this is string example....wow!!!"
>>>Print( str.upper())
THIS IS STRING EXAMPLE....WOW!!!
#str.find(sub[, start[, end]]):检测字符串中是否包含子字符串 sub ,如果指定 start (开始索引,默 #认为0 ) 和 end(结束索引,默认为字符串的长度) 范围,则检查是否包含在指定范围内,如果包含子字符串 #返回开始的索引值,否则返回-1。
>>>str1 = "this is string example....wow!!!";
>>>str2 = "exam";
>>>print str1.find(str2);
>>>print str1.find(str2, 10);
>>>print str1.find(str2, 40);
15
15
-1
#str.replace(old, new[, count]):把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三 #个参数max,则替换不超过 count 次。
>>>str = "this is string example....wow!!! this is really string";
>>>print str.replace("is", "was");
>>>print str.replace("is", "was", 3);
thwas was string example....wow!!! thwas was really string
thwas was string example....wow!!! thwas is really string
2.2再谈字符串——字符串与数值型相互转化。
将字符串类型转换成相应的数值类型则需要调用相应的转换函数。
例如,int()函数可以将字符串转化为整数,float()函数可以将字符串转化为浮点数,比如str=”123”,那么int(str)的返回值为123;如果str=“123.45”,那么float(str)的返回值为123.45。
如果希望将字符串的每一个字符作为一个元素保存在一个列表中,可以使用list()函数,比如str=“123, 45”,list(str)的返回值为[‘1’, ‘2’,‘3’,‘,’,‘’,‘4’,‘5’]。注意逗号’,’和空白‘’都当做一个字符。
如果希望将字符串分开,那么可以使用字符串专用方法split。例如,str=“123, 45”,将其以“,”分割,使用L=str.split(“,”)便可实现。其返回值是一个列表[“123”,“45”],需要注意的是,得到的列表中每个元素都是字符串类型,空白仍然在字符串“ 45”里面的。如果要得到整数类型的,还需要将字符串转化为数值.
使用L=[int(e) for e in L]可将L=[“123”,“45”]转化为单纯的整数列表L=[123,45]。
三.字典
字符串、列表、元组都是序列,而Python的基本数据结构,除了序列外,还包括映射。字典是Python中唯一的映射类型。字典的形式为{ }。
字典中的每一个元素都是一个键值对(Key:Value),而键Key在字典中只会出现一次。键是集合X中的一个元素,而Value指的是集合Y中的一个元素,而f(key)=value。
与序列一样,映射也有内置操作符与内置函数,最常用的内置操作符仍然是下标操作符[],例如mdict[‘H’],将返回键’H’所对应的value,即1。
操作符[]也可以作为字典赋值使用。例如,mdict[‘H’]=1,假如mdict里面没有‘H’、这个键,就会将‘H’:1加入mdict里面,假如有‘H’这个键,其值就被更改为1了。
另外,in与not in在字典中仍然适用,例如’o’ in mdict将返回True,而’z’ in mdict将返回False。
最常用的函数是len(dict),它将返回字典中键值对的个数。
函数 | 作用/返回 | 参数 | print结果 | |
1 | mdict.clear() | 清空mdict的键值对 | 无 | {} |
2 | mdict.copy() | 得到字典mdict的一个拷贝 | 无 | {'H':1, 'e':2} |
3 | mdict.items() | 得到一个list的全部键值对 | 无 | [('H',1),('e',2)] |
4 | mdict.keys() | 得到一个list的全部键 | 无 | ['H','e'] |
5 | mdict.update([b]) | 以b字典更新a字典 | {'H':3} | {'H':3,'e':2} |
6 | mdict.values() | 得到一个list的全部值 | 无 | [1,2] |
7 | mdict.get(k[, x]) | 若mdict[k]存在则返回,否则返回x | 'o',0 | 0 |
8 | mdict.setdefault(k[, x]) | 若mdict[k]不存在,则添加k:x | 'x':3 | {'H':1,'e':2,'x':3} |
9 | mdict.pop(k[, x]) | 若mdict[k]存在,则删除 | H | {'e':2} |
#<程序:统计字符串中各字符出现次数>
>>>mstr = "Hello world, I am using Python to program, it is very easy to implement."
mlist = list(mstr)
mdict = {}
for e in mlist:
if mdict.get(e,-1)==-1: #还没出现过
mdict[e]=1
else: #出现过
mdict[e]+=1
for key,value in mdict.items():
print (key,value)