链表类型的所有方法
append(x) 把一个元素添加到链表结尾a[len(a):]=[x]
extend(L) 通过添加指定链表的所有元素来扩充连表,相当于a[len(a):]=L
insert(i,x) 在指定位置出入元素。第一个参数是位置,第二个是插入值。a.insert(len(a),x)相当于a.append(x)
remove(x) 删除链表中第一个值为x的元素并将其返回,如果没有这样的元素,返回错误
pop([i]) 从链表的指定位置删除元素,并将其返回,如果没有指定索引,a.pop()返回最后一个元素
index(x) 返回链表中第一个值为x的元素的索引,如果没有匹配元素返回错误。
count(x) 返回x在链表中出现的次数
sort() 对链表中的元素进行适当的排序
reverse() 倒排链表中的元素
链表的特殊使用
可以将链表当做堆栈来使用。堆栈后进先出,用append()犯法可以把一个元素添加到堆栈顶。用不指定索引的pop()方法可以把一个元素从堆栈顶释放出来。
链表可以当做队列使用。队列先进先出。使用append()方法可以把元素添加到队列最后,以0为参数调用pop()方法可以把最先进入的元素释放出来。
函数化编程工具
对于链表来讲,有三个内置函数非常有用:filter(),map() , 和 reduce() 。
“filter(function , sequence)” 返回一个序列(sequence ),包括了给定序列中所有调用function(item)后返回值
为true的元素。(如果可能的话,会返回相同的类型)。例如,以下程序可以计算部分素数:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
“map(function , sequence)” 为每一个元素依次调用 function (item)并将返回值组成一个链表返回。例如,以下程序计算立方:
>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
可以传入多个序列,函数也必须要有对应数量的参数,执行时会依次用各序列上对应的元
素来调用函数(如果某些序列比其它的短,就用None来代替)。如果把None做为一个函数传入,则直接返回参数做为替代。
组合这两种情况,我们会发现“map(None, list1, list2)”是把一对序列变成元素对序列的便捷方式。例如:
>>> seq = range(8)
>>> def square(x): return x*x
...
>>> map(None, seq, map(square, seq))
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]
"reduce(func , sequence )" 返回一个单值,它是这样构造的:首先以序列的前两个元素调用函数,再以返回值和第三个参数调用,依次执行下去。例如,以下程序计算1到10的整数之和:
>>> def add(x,y): return x+y
...
>>> reduce(add, range(1, 11))
如果序列中只有一个元素,就返回它,如果序列是空的,就抛出一个异常。
可以传入第三个参数做为初始值。如果序列是空的,就返回初始值,否则函数会先接收初始值和序列的第一个
元素,然后是返回值和下一个元素,依此类推。例如:
>>> def sum(seq):
... def add(x,y): return x+y
... return reduce(add, seq, 0)
...
>>> sum(range(1, 11))
55
>>> sum([])
0
不要像示例中这样定义 sum() :因为合计数值是一个通用的需求,在新的2.3版中,提供了内置的sum(sequence )函数
链表推导式
链表推导式提供了一个创建链表的简单途径,无需使用 map() ,filter() 以及 lambda。 返回链表的定义通常要比创建这些链表更清晰。每一个链表推导式包括在一个for语句之后的表达式,零或多个for或if语句。返回值是由for或if子句之后的表达式得到的元素组成的链表。如果想要得到一个元组,必须要加上括号。
>>> [3*x for x in vec if x < 2]
>>> [x+y for x in vec1 for y in vec2]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
del()语句
可以从链表中删除指定索引的元素,也可以从链表中删除切片或整个变量。
>>> del a[0] >>> del a[2:4] >>> del a
元组(Tuple)和序列(Sequences)
一个元组由数个逗号分隔的值组成,例如:
>>> t = 12345, 54321, 'hello!'
>>> t
(12345, 54321, 'hello!')
u = t, (1, 2, 3, 4, 5)
元组可以嵌套
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))学python需要什么
元组输出时总是有括号的。可用于(x,y)坐标点,数据库中的员工记录等等。元组就像字符串,不可改变:不能给元组的一个独立的元素赋值(尽管你可以通过联接和切片来模仿)。也可以通过包含可变对象来创建元组,例如链表。
一对空的括号可以创建空元组;要创建一个单元素元组可以在值后面跟一个逗号(在括号中放入一个单值是不够的)
>>> x, y, z = t
这个调用被称为序列拆封非常合适。序列拆封要求左侧的变量数目与序列的元素个数相同。要注意的是可变参数(multiple assignment)其实只是元组封装和序列拆封的一个结合!
这里有一点不对称:封装多重参数通常会创建一个元组,而拆封操作可以作用于任何序列。
字典(Dictionay)
字典以关键字为索引, 关键字可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以做为关键字,如果它直接或间接的包含了可变对象,就不能当做关键字。不能用链表做关键字,因为链表可以用它们的 append() 和 extend() 方法,或者用切片、或者通过检索变量来即时改变。
一对大括号创建一个空的字典:{}。关键字必须互不相同。字典的主要操作是依据关键字来存储和析取值。也可以用del来删除关键字:值对。字典的keys() 方法返回由所有关键字组成的链表,该链表的顺序不定(如果你需要它有序,只能调用关键字链表的sort()方法)。使用字典的 has_key() 方法可以检查字典中是否存在某一关键字。
循环技巧
在字典中循环时,关键字和对应的值可以使用 items() 方法同时解读出来。
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... print k, v
...
gallahad the pure
在序列中循环时,索引位置和对应值可以使用 enumerate() 函数同时得到。
同时循环两个或更多的序列,可以使用 zip() 整体解读。
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
... print 'What is your %s? It is %s.' % (q, a)
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
深入条件控制
in和not比较操作符审核值是否在一个区间之内。操作符is和is not比较两个对象是否相同; 这只和诸如链表这样的可变对象有关。所有的比较操作符具有相同的优先级,低于所有的数值操作。
逻辑操作符and 和or 也称作短路操作符:它们的参数从左向右解析,一旦结果可以确定就停止。
可以把比较或其它逻辑表达式的返回值赋给一个变量
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论