码迷,mamicode.com
首页 > 其他好文 > 详细

基本数据结构

时间:2015-09-15 21:33:53      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

一、List数据类型的方法


 

定义两个list,a和b:a=[1,2,3,4],b=[7,8,9,10]

a.append(x)            在a的末尾附加x元素

a.extend(b)            在a的末尾添加b的所有元素

a.insert(i,x)            在a的第i个元素位置之后插入x元素,即a.insert(len(a),x)等价于a.append(x)

a.remove(x)           在a中移除第一个出现的x元素

a.pop()                  返回:a的最后一个元素,并在a中删除该元素

a.index(x)              返回x元素的索引值,若a中不存在x元素,则返回一个错误

a.count(x)              返回x元素在a中出现的次数

a.sort()                  对a中的元素进行排序

a.reverse()             将a中的元素逆序

del a[i]                   删除该元素

(以上这些方法都是在原来的表的上进行操作,会对原来的表产生影响,而不是返回一个新表。)

 1 >>> a=[1,2,3,4]
 2 >>> a.append(5)
 3 >>> a
 4 [1, 2, 3, 4, 5]
 5 >>> a.insert(5,6)
 6 >>> a
 7 [1, 2, 3, 4, 5, 6]
 8 >>> b=[7,8,9,10]
 9 >>> a.extend(b)
10 >>> a
11 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
12 >>> a.remove(2)
13 >>> a
14 [1, 3, 4, 5, 6, 7, 8, 9, 10]
15 >>> a.pop()
16 10
17 >>> a
18 [1, 3, 4, 5, 6, 7, 8, 9]
19 >>> a.index(5)
20 3
21 >>> a.count(5)
22 1
23 >>> a.reverse()
24 >>> a
25 [9, 8, 7, 6, 5, 4, 3, 1]
26 >>> del a[2]
27 >>> a
28 [9, 8, 6, 5, 4, 3, 1]
29 >>> a.sort()
30 >>> a
31 [1, 3, 4, 5, 6, 8, 9]

二、List作为stacks使用


 

Stack:堆栈,即后进先出(last-in, first-out),只有一端(称为栈顶(top))对数据项进行插入和移除,在栈顶使用append()添加一个元素,在栈顶使用pop()移除一个元素。

 1 >>> stack=[1,2,3]
 2 >>> stack.append(4)
 3 >>> stack.append(5)
 4 >>> stack
 5 [1, 2, 3, 4, 5]
 6 >>> stack.pop()
 7 5
 8 >>> stack
 9 [1, 2, 3, 4]
10 >>> stack.pop()
11 4
12 >>> stack.pop()
13 3
14 >>> stack
15 [1, 2]

三、List作为queues使用


 

Queue:队列,即先进先出(first-in, first-out),一头进一头出,先进去的在前面,自然先从另一边出来。

注意:此处list作为queue使用,效率不是很高,当往list的结尾处添加(append())或移除(pop())元素时是快的,当往list的开始处插入(insert())或移除(pop())元素时是慢的,原因是后者所有的其它元素都需要移动。这里建议使用collections.deque,它在前后两端appends和pops时都很快。

 1 >>> from collections import deque
 2 >>> queue = deque(["Eric","John","Michael"])
 3 >>> queue.append("Terry")
 4 >>> queue.append("Graham")
 5 >>> queue.popleft()
 6 Eric
 7 >>> queue.popleft()
 8 John
 9 >>> queue
10 deque([Michael, Terry, Graham])

四、filter()、map()、reduce()方法使用


filter(function,sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个list/string/tuple(取决于sequence的类型)返回:

1 >>> def f(x):return x % 3 == 0 or x % 5 == 0
2 >>> filter(f,range(2,25))
3 [3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24]
4 >>> def f(x):return x != a
5 >>> filter(f,"abcdef")
6 bcdef

map(function,sequence):对sequence中的item依次执行function(item),将执行结果组成一个list返回:

1 >>> def cube(x):return x*x*x
2 >>> map(cube,range(1,11))
3 [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
4 >>> def cube(x):return x+x
5 >>> map(cube,"abcde")
6 [aa, bb, cc, dd, ee]
7 >>> def add(x,y):return x+y
8 >>> map(add,range(8),range(8))
9 [0, 2, 4, 6, 8, 10, 12, 14]

reduce(function,sequence):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对list求和:

1 >>> def add(x,y):return x+y
2 >>> reduce(add,range(1,11))
3 55 (注:1+2+3+4+5+6+7+8+9+104 >>> def add(x,y):return x+y
5 >>> reduce(add,range(1,11),20)
6 75 (注:1+2+3+4+5+6+7+8+9+10+20)

五、List Comprehensions


列表推导式(list comprehension)是一种方便简介的语法形式,我们可以利用它将一个list经过过滤后转换成另一个list,也可以利用它将函数应用于list中的元素。

1 >>> squares = [x**2 for x in range(10)]
2 >>> squares
3 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

squares = [x**2 for x in range(10)] 等价于以下常规写法

1 >>> squares = []
2 >>> for x in range(10):
3 ...     squares.append(x**2)
4 ...     
5 >>> squares
6 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

是不是上面看起来更简洁及可读性更好,再举一例如下:

1 >>> [(x,y) for x in [1,2,3] for y in [3,1,4] if x != y]
2 [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

等价于以下常规写法

1 >>> combs=[]
2 >>> for x in [1,2,3]:
3 ...     for y in [3,1,4]:
4 ...         if x != y:
5 ...             combs.append((x,y))
6 ...             
7 >>> combs
8 [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

具体应用如下:

 1 >>> vec = [-4,-2,0,2,4]
 2 >>> [x*2 for x in vec]        #返回一个新的list,新list元素值是原先元素值的2倍
 3 [-8, -4, 0, 4, 8]
 4 >>> [x for x in vec if x>=0]  #返回一个新的list,值为原list中大于0的元素
 5 [0, 2, 4]
 6 >>> [abs(x) for x in vec]     #返回一个新的list,值为对原list中的元素值求绝对值
 7 [4, 2, 0, 2, 4]
 8 
 9 >>> freshfruit = [ banana, apple,orange ]
10 >>> [weapon.strip() for weapon in freshfruit]   #strip()去掉前后空格
11 [banana, apple, orange]
12 >>> [(x,x**2) for x in range(6)]
13 [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
14 >>> vec = [[1,2,3],[4,5,6],[7,8,9]]
15 >>> [num for elem in vec for num in elem]
16 [1, 2, 3, 4, 5, 6, 7, 8, 9]

List comprehensions支持复杂的表达式和嵌套函数

 1 >>> from math import pi
 2 >>> [str(round(pi,i)) for i in range(1,6)]
 3 [3.1, 3.14, 3.142, 3.1416, 3.14159]
 4 
 5 >>> matrix=[
 6 ...     [1,2,3,4],
 7 ...     [5,6,7,8],
 8 ...     [9,10,11,12],
 9 ...     ]
10 ...     
11 >>> [[row[i] for row in matrix] for i in range(4)]
12 [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

六、Tuples和Sequences


 

sequence(序列)是一组有顺序的元素的集合

(严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素)

 

序列可以包含一个或多个元素,也可以没有任何元素。

我们之前所说的基本数据类型,都可以作为序列的元素。元素还可以是另一个序列,以及我们以后要介绍的其他对象。

 

序列有两种:tuple(定值表; 也有翻译为元组) 和 list (表)

 

序列有两种:tuple(定值表; 也有翻译为元组) 和 list (表)

>>>s1 = (2, 1.3, ‘love‘, 5.6, 9, 12, False)         # s1是一个tuple

>>>s2 = [True, 5, ‘smile‘]                              # s2是一个list

 

tuple和list的主要区别在于,一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更。

七、Sets


Set:创建一个无序不重复的元素集,基本功能包含关系测试和消除重复元素,集合对象还支持union(联合),intersection(交),difference(差)和sysmmetric difference(对称差集)等数学运算。

 

 1 >>> basket = [apple,orange,apple,pear,orange,banana]
 2 >>> fruit = set(basket)
 3 >>> fruit
 4 set([orange, pear, apple, banana])
 5 >>> orange in fruit
 6 True
 7 >>> crabgrass in fruit
 8 False
 9 
10 >>> a = set(abracadabra)
11 >>> b =set(alacazam)
12 >>> a
13 set([a, r, b, c, d])
14 >>> b
15 set([a, c, z, m, l])
16 >>> a-b
17 set([r, b, d])
18 >>> a|b
19 set([a, c, b, d, m, l, r, z])
20 >>> a&b
21 set([a, c])
22 >>> a^b
23 set([b, d, m, l, r, z])
24 
25 >>> a = {x for x in abracadabra if x not in abc}
26 >>> a
27 set([r, d])

 八、字典(Dictionaries)


 

字典:存储一对key、value

 1 >>> tel={jack:4098,sape:4139}
 2 >>> tel[guido] = 4127
 3 >>> tel
 4 {sape: 4139, jack: 4098, guido: 4127}
 5 >>> tel[jack]
 6 4098
 7 >>> del tel[sape]
 8 >>> tel[irv] = 4127
 9 >>> tel
10 {jack: 4098, irv: 4127, guido: 4127}
11 >>> tel.keys()
12 [jack, irv, guido]
13 >>> guido in tel
14 True
15 
16 >>> dict([(sape,4139),(guido,4127),(jack,4098)])
17 {sape: 4139, jack: 4098, guido: 4127}
18 >>> dict(sape=4139,guido=4127,jack=4098)
19 {sape: 4139, jack: 4098, guido: 4127}

dict()构造方法可以从一个key-value序列创建成字典

九、循环技巧

 1 >>> for i,v in enumerate([tic,tac,toe]):
 2 ...     print i,v
 3 ...     
 4 0 tic
 5 1 tac
 6 2 toe
 7 >>> questions = [name,quest,favorite color]
 8 >>> answers = [lancelot,the holy grail,blue]
 9 >>> for q,a in zip(questions,answers):
10 ...     print What is your {0}? It is {1}.. format(q,a)
11 ...     
12 What is your name? It is lancelot.
13 What is your quest? It is the holy grail.
14 What is your favorite color? It is blue.
15 
16 >>> for i in reversed(xrange(1,10,2)):
17 ...     print i
18 ...     
19 9
20 7
21 5
22 3
23 1
24 >>> basket = [apple,orange,apple,pear,orange,banana]
25 >>> for f in sorted(set(basket)):
26 ...     print f
27 ...     
28 apple
29 banana
30 orange
31 pear

 


 

基本数据结构

标签:

原文地址:http://www.cnblogs.com/hailunyoo/p/4811274.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!