python学习笔记(4)——list[ ]
发现个问题,python与C、JAVA等语言相比学习障碍最大差别居然在于版本更迭!这是python官方造的虐啊。。。
有时针对某问题去google答案,或者自己去博客找共性解答,会出现相互矛盾或者与你正在使用的教程相悖的地方,不知道其他人情况,我自己70%卡壳都是 py2.2与py3.0的语法结构改变!!!
想想今后还有几个月时间要与浪费声明的版本问题做斗争就头大!!!
今天是list &tuple,好吧,开始
python中有六种内建的序列:列表、元素、字符串、Unicode字符串、buffer对象和xrange对象。
六种通用序列操作:
1.索引(index)
2.切片(slice)
3.加(+)
4.乘(*)
5.检测某个元素是否属于这个序列(in或not in)
6.计算序列长度(len())
7.找出最大元素和最小元素 min()、max()
1.索引:序列中所有的元素都有编号,索引从0开始递增。使用负数索引时,python会从右边开始计数(-1指的是序列最右边的元素)
#索引格式 list[x] 、tuple[x]、str[x] 例1-创建list类表 l,并索引其元素 >>> l=['apple','micorosoft','sony'] >>> type(l) <class 'list'> >>> l[0] 'apple' >>> l[2] 'sony' >>> l[-1] #负数索引,-1 即倒1 'sony' >>> l[-2] 'micorosoft' 例2-创建tuple类表 t,并索引其元素 >>> t=('css','java','php') >>> type(t) <class 'tuple'> >>> t[0] 'css' >>> t[-1] 'php' 例3-创建str字符串 s,并索引其元素(虽然不是‘表’,但仍可索引,只要其为‘可迭代序列’) >>> s='abc123'
>>> type(s)
<class 'str'> >>> s[0] 'a' >>> s[-2] '2' >>> #后3种序列方法再续
1 >>> a='apple'
2 >>> a[0] 3 'a' 6 >>> a[-1] 7 'e' 8 >>> type('a') 9 <class 'str'>
>>> s.pop() #字符串也属于序列,可索引,但无list、tuple类函数如 pop、append等,因为那些是人家内置的
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'pop'
#索引(index)-只是一种操作方式,它可用在“python中有六种内建的序列:列表、元素、字符串、Unicode字符串、buffer对象和xrange对象。”中的任何一种,list可以用,str也可以用,它是6种序列的"通用函数",并不局限于list()。而list自己内置的独属函数在下面
#list()方法语法: >>> list(seq) #参数seq可以是任何'可迭代序列',即 list()可将任何'可迭代序列'定义为list eg: >>> s='123abc' >>> s1=list(s) >>> s1 ['1', '2', '3', 'a', 'b', 'c'] #参数seq也可以调用范围函数range() >>> h=range(10) >>> h range(0, 10) >>> h1=list(h) >>> h1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #或直接定义: >>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
LIST的一些内置函数规则: len 、append()、pop()、remove(obj)、del、count、sort、sorted、insert
>>> list1=['Python','Java','C','JavaScript','C#','Ruby','PHP']
>>> len(list1)
7 >>> list1[0] 'Python' >>> list1[2] 'C' >>> list1[-1] 'PHP' #list.append() 末尾添加元素(参数唯一) #与extend()有本质区别,append()将参数视为独立元素添加,extend()将入参列表元素解包归入目标列表。#相同:俩函数内存地址均不改变,属对原函数的修改,不是新建。 >>> list1.append('html5') >>> list1 ['Python', 'Java', 'C', 'JavaScript', 'C#', 'Ruby', 'PHP', 'html5'] #list.pop() 默认删除末尾元素,(可指定索引号而删除指定位置元素) >>> list1.pop() 'html5' >>> list1 ['Python', 'Java', 'C', 'JavaScript', 'C#', 'Ruby', 'PHP'] >>> list1.pop(1) 'Java' >>> list1 ['Python', 'C', 'JavaScript', 'C#', 'Ruby', 'PHP'] #附1:指定元素名的删除方法,多个同名元素 默认删除第一个 #list.remove(obj)
>>> list1.remove('C') >>> list1 ['Python', 'java', 'JavaScript', 'C#', 'Ruby', 'PHP']
#附1:del运算符 删除元素(pop为python内置函数)
#def list[x]([x:y])
>>> del list1[1]
>>> list1
['Python', 'JavaScript', 'C#', 'Ruby', 'PHP']
>>> del list1[2:4]
>>> list1
['Python', 'C', 'Ruby', 'PHP']
>>> x=['a','b'] >>> y=x >>> y ['a', 'b'] >>> del x >>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined >>> y ['a', 'b']
#count:用于统计某个元素在列表中出现的次数
#list.count(obj)
>>> l=['a','b','b','c','d']
>>> l.count('b')
2
#sort对列表进行原址排序 http://www.cnblogs.com/sunny3312/archive/2017/01/07/6260472.html
>>> x=[3,1,2,7,6,9,8]
>>> x.sort()
>>> x
[1, 2, 3, 6, 7, 8, 9] #x在排序的同时已被修改,若要不改原序列而进行原址排序,可用“副本排序”
#副本排序两种方法:
1)[:]分片方法
>>> x =[4, 6, 2, 1, 7, 9]
>>> y=x[:] #注意:y = x[:] 通过分片操作将列表x的元素全部拷贝给y,如果简单的把x赋值给y:y = x,y和x还是指向同一个列表,并没有产生新的副本。
>>> y.sort()
>>> y
[1, 2, 4, 6, 7, 9]
>>> x
[4, 6, 2, 1, 7, 9]
2)sorted方法
sorted返回一个有序的副本,并且类型总是列表,如下:
>>> x =[4, 6, 2, 1, 7, 9]
>>> y=sorted(x) #sorted(x)生成一个副本序列,再将其排序,不改变x
>>> y
[1, 2, 4, 6, 7, 9]
>>> x
[4, 6, 2, 1, 7, 9]
#list.insert(索引号,插入元素) 指定位置插入元素,本位元素后移
>>> list1.insert(1,'java')
>>> list1
['Python', 'java', 'C', 'JavaScript', 'C#', 'Ruby', 'PHP']
#把某个元素替换成别的元素,可以直接赋值给对应的索引位置
>>> list1
['Python', 'Java', 'C', 'JavaScript', 'C#', 'Ruby', 'PHP']
>>> list1[0]='css'
>>> list1
['css', 'Java', 'C', 'JavaScript', 'C#', 'Ruby', 'PHP']
#list中元素类型可混合>>> L = ['Apple', 123, True] #字符串、int、 布尔值
#表中表
>>> l=[1,2,3,['a','b'],4,5]
#取值可用l[],l[][]格式
eg:取a
>>> l[3][0]
'a'
#list可为空 []>>> L = []
>>> len(L)
0
写到这吧,不把学习的过程都写出来了,太累了~
2.切片(slice)
用"索引"访问单个元素,可以使用"切片"操作来访问一定范围内的元素
>>> l=['a','b','c','d','e'] #0-4位 >>> l[0:3] # 切片规则: 类似左闭右开区间,即'取左不取右' ['a', 'b', 'c'] #从边界取元素,可省略边界(隐式) 边界全部写明=显式 >>> l[:3] # =l[0:3] ['a', 'b', 'c'] >>> l[2:] #=l[2:5] 虽然l只有0-4位,但由于取左不取右规则,要取最右的4位,需多取一位 #如果涉及边界取位,建议用'隐式',可防止出错 ['c', 'd', 'e'] #负数取位,规则同上 >>> l[-2:-1] ['d'] >>> l[-2:] ['d', 'e'] >>> l[:] #边界全省略(隐式),相当于从开始取到结束=全部ist ['a', 'b', 'c', 'd', 'e'] #还有一个默认'隐式'的参数-步长(step length) >>>l #默认步长=1(隐式),即每位取1元素 ['a', 'b', 'c', 'd', 'e'] >>> l[0:5:2] #设定步长 :2,即每两位取一元素 ['a', 'c', 'e'] >>> l[-4::2] #负索引取位规则同,但取得元素依然是正序 ['b', 'd'] #步长不能为0,但可为负 即反向取位,须让开始点大于结束点 >>> l[5:2:-1] ['e', 'd'] #注:负数步长取得元素顺序是反的,而负数索引取位取得元素依然是正序。
#正、负数索引取得元素皆正序排列,要得到反向排列 须设定步长为负值。 #tuple 、str皆可切片,规则同
#小应用-反向排序
>>> l=['a', 'b', 'c', 'd', 'e']
>>> l[::-1]
['e', 'd', 'c', 'b', 'a']
#其实python有内置 反向排序函数 reverse
# list.reverse()
>>> s=[1,2,3,4,5]
>>> s.reverse()
>>> s
[5, 4, 3, 2, 1]
3.序列相加:使用加号可以对两个类型相同的序列进行连接操作:(append、extend、+=、均是在原list基础上添加,不改变目标内存地址。而唯独‘+’是创建新变量储存结果。)
#list相加 >>> a=[1,2,3] >>> b=['a','b','c'] >>> a+b # ‘ + ’操作符 视为将结果赋予一个新建的变量,内存地址改变。想要不改变,使用‘+=’操作符,视为在原list基础上添加。 [1, 2, 3, 'a', 'b', 'c'] #tuple相加 #规则同上 >>> a=(1,2,3) >>> b=('a','b','c') >>> a+b (1, 2, 3, 'a', 'b', 'c') #str相加 #规则同上 >>> a='123' >>> b='abc' >>> a+b '123abc' #不同类型不可相加操作 >>> a=[1,2,3] >>> b=(1,2,3) >>> a+b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "tuple") to list
#可用于字符串连接
>>> 'My name '+'is '+'python'
'My name is python' #自己注意空格格式
#类比另一个“序列追加”-extend
:可以在列表末尾一次性追加另一个序列中的多个值,和连接操作符‘+’不同,extend方法是修改了被扩展的序列(调用extend方法的序列),而原始的连接操作符‘+’返回的是一个全新的列表
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a+b #连接两个list得到一个新list,但a,b各自并无变化
[1, 2, 3, 4, 5, 6]
>>> a #a还是原样
[1, 2, 3]
>>> a.extend(b) #extend 是把a改造,将b中元素追加给a,改造后的a不是原来的a.
>>> a
[1, 2, 3, 4, 5, 6]
#index:用于从列表中找出某个值第一个匹配项的索引位置
#list.index(obj) 由元素名找对应索引位,若有多个同名元素,取第一个序位元素
>>> l=['a','b','c','d','e']
>>> l.index('c')
2
4.序列乘法: 使用数字n乘以一个序列会生成新的序列,在新的序列中,原来的序列将被重复n次。
>>> 'helloworld'*3 'helloworldhelloworldhelloworld' >>> [10]*5 [10, 10, 10, 10, 10] >>> (1,2,3)*5 (1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)
#创建只占元素空间不赋值的序列,None为python内建值
>>> seq = [None] * 10
>>> seq
[None, None, None, None, None, None, None, None, None, None]
5.成员判断:可以使用in或not in运算符判断一个对象是否为某个序列的成员 #一系列python运算符参看http://python.jobbole.com/82706/ --- http://www.yiibai.com/python/python_basic_operators.html
#返回布尔值 >>> L=[1,2,3,'a','b','c'] >>> 1in L True >>> 'a'in L True >>> 'e'not in L True #tuple类也支持此判断函数 >>> s=(1,2,3) >>> 1in s True >>> 4in s False #str类也支持此判断函数 >>> r='abc123' >>> 'a'in r True >>> 'bc'in r True
#多重嵌套判断
>>> s=[1,2,3,['a','b','c'],4,5] #二维序列
>>> 'a' in s[3]
True
>>> s=[1,2,3,['a','b','c',['r1','r2']],4,5] #三维序列
>>> 'r1' in s[3][3]
True
6.长度、最大值和最小值 (len/min/max)
>>> N=[-1,5,66.7] >>> len(N) 3 >>> min(N) -1 >>> max(N) 66.7 >>> s='397' >>> len(s) 3 >>> min(s) '3' >>> max(s) '9' #tuple规则同,略