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规则同,略

 

posted @ 2017-10-04 05:28  深藍  阅读(372)  评论(0编辑  收藏  举报