python数据结构--2017-7-26

来源:互联网 发布:mac怎么卸载驱动 编辑:程序博客网 时间:2024/06/05 14:31

5.数据结构

5.1 深入列表

list对象的所有方法:

list.append(x)    添加一个元素到列表的末尾

list.extend(L)  将指定列表中的所有元素添加到另一个列表的末尾

list.insert(i,x)  在给定位置插入一个元素

list.remove(x) 删除列表中第一个值为x的元素,如果没有这样的元素将会报错。

list.pop(i)  删除列表中指定位置的元素并返回它,如果是list.pop()将删除并返回列表中的最后一个元素

list.index(x)  返回列表中第一个值为x的元素的索引。如果没有这样的元素将会报错。

list.count(x)  返回列表中x出现的次数。

list.sort(cmp=None, key=None, reverse=False)   原地排序列表中的元素

list.reverse()   原地反转列表中的元素。

测试代码:

# -*- coding: UTF-8 -*-
'''
Created on 2017��7��26��

@author: zmz
'''
a = [66.25, 333, 333, 1, 1234.5]
print a.count(333), a.count(66.25),a.count('x')
a.insert(2, -1)
a.append(333)
print a
print a.index(333)
a.remove(333)
print a
a.reverse()
print a
a.sort()
print a
print a.pop();
print a

答案:

2 1 0
[66.25, 333, -1, 333, 1, 1234.5, 333]
1
[66.25, -1, 333, 1, 1234.5, 333]
[333, 1234.5, 1, 333, -1, 66.25]
[-1, 1, 66.25, 333, 333, 1234.5]
1234.5
[-1, 1, 66.25, 333, 333]

   

5.1.1 用list(列表)作为stack(栈)

列表方法使得将list当做栈非常容易,最先进入的元素最后一个取出(后进先出)。使用append()将元素添加到栈顶。使用不带索引的pop()从栈顶取出元素。

stack = [3, 4, 5]
stack.append(6)
stack.append(7)
print stack
print stack.pop()
print stack.pop()
print stack.pop()
print stack

答案:

[3, 4, 5, 6, 7]
7
6
5
[3, 4]


5.1.2 用list(列表)作为queue(队列)

也可以将列表当做队列使用,此时最先进入的元素第一个取出(先进先出),但这种方法效率很低。

可以使用collections.deque, 它设计的目的就是在两端都能够快速添加和弹出元素。

from collections import deque
queue = deque(["Eric","John","Michael"])
queue.append("Terry")
queue.append("Graham")
print queue.popleft()
print queue.popleft()
print queue

答案:

Eric
John
deque(['Michael', 'Terry', 'Graham'])


5.1.3 函数式编程工具

使用列表时三个函数非常有用:

filter(),map(),reduce()。

1.filter()

filter(function,sequence)返回的序列由function(item)结果为真的元素组成。

def f(x):return x % 2 != 0 and x % 3 != 0
print filter(f, range(2,25))   
print range(2,25)#2--24

答案:

[5, 7, 11, 13, 17, 19, 23]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]


2.map()

map(function,sequence) 为序列中的每一个元素调用function(item) 函数并返回结果的列表。

def cube(x):return x*x*x
print map(cube,range(1,11))

答案:

[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]


3.reduce()

reduce(function,sequence) 只返回一个值,它首先以序列的前两个元素调用函数function,然后再以返回的结果和下一个元素继续调用,依此执行下去。

def add(x,y):return x+y
print reduce(add, range(1,11))

答案:

55


5.1.4 列表推导式


5.2 del语句

有个方法可以从列表中根据索引而不是值来删除一个元素:del语句。这不同于有返回值的pop()方法。del语句还可以用于从列表中删除切片或清除整个列表(之前我们是将空列表赋值给切片)。

a=[-1,1,66.25,333,333,1234.5]
del a[0]
print a
del a[2:4]  #2,3---第3个和第四个
print a
del a[:]
print a

答案:

[1, 66.25, 333, 333, 1234.5]
[1, 66.25, 1234.5]
[]


5.3 Tuples(元祖)和sequence(序列)

我们已经看到列表和字符串具有很多共同的属性,如索引和切片操作。它们是序列数据类型的两个例子(参见序列类型 — str, unicode, list, tuple, bytearray, buffer, xrange)。因为 Python 是一个正在不断进化的语言,其他的序列类型也可能被添加进来。还有另一种标准序列数据类型:元组


5.4 set(集合)

Python还包含一个数据类型用于集合集合中的元素没有顺序且不会重复。集合的基本用途有成员测试和消除重复的条目。集合对象还支持并集、交集、差和对称差等数学运算。

花括号或set()函数可以用于创建集合。注意:若要创建一个空的集合你必须使用set(),不能用{}后者将创建一个空的字典,一个我们在下一节中要讨论的数据结构。

这里是一个简短的演示


5.5 字典

Python内建的另一种有用的数据类型是字典(见映射类型 — 字典)。在其它语言中字典有时被称为“联合存储” 或者 “联合队列”。与序列不同,序列由数字做索引,字典由key 做索引,key可以是任意不可变类型;字符串和数字常用来做key。

tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
print tel
print tel['jack']
del tel['sape']
tel['irv'] = 4127
print tel
print tel.keys()
print 'guido' in tel

答案

{'sape': 4139, 'jack': 4098, 'guido': 4127}
4098
{'jack': 4098, 'irv': 4127, 'guido': 4127}
['jack', 'irv', 'guido']
True

dict()构造函数直接从键-值对序列创建字典:

>>>
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]){'sape': 4139, 'jack': 4098, 'guido': 4127}


5.6 遍历的技巧

5.7 深入条件控制

whileif 语句中使用的条件可以包含任意的操作,而不仅仅是比较。

比较操作符 innot in 检查一个值是否在一个序列中出现(不出现)。isis not 运算符比较两个对象是否为相同的对象;这只和列表这样的可变对象有关。所有比较运算符都具有相同的优先级,低于所有数值运算符。

比较可以级联。例如,a< b ==c测试a是否小于b并且b是否等于c

可以使用布尔运算符 andor 组合,比较的结果(或任何其他的布尔表达式)可以用not 取反。这些操作符的优先级又低于比较操作符;它们之间,not 优先级最高,or 优先级最低,所以 A and not B or C 等效于 (Aand (not B))or C与往常一样,可以使用括号来表示所需的组合。

布尔运算符andor 是所谓的 短路 运算符:依参数从左向右求值,结果一旦确定就停止。例如,如果AC 都为真,但B是假,A and B and C 将不计算表达式C用作一个普通值而非逻辑值时,短路操作符的返回值通常是最后一个计算的。

可以把比较或其它逻辑表达式的返回值赋给一个变量。例如,