Python学习 Part3:数据结构
Python学习 Part3:数据结构
1. 深入列表:
- 所有的列表对象方法
list.append(x): 在列表的末尾添加一个元素
list.extend(L): 在列表的末尾添加一个指定列表的所有元素
list.insert(i,x): 在指定位置插入一个元素
list.remove(x): 删除列表中值为x的第一个元素,如果不存在这样的元素则引发错误
list.pop(i): 删除列表中指定位置元素并返回它(指元素值)。如果省略索引,a.pop()会删除并返回列表中的最后一个元素
list.index(x): 返回列表中值为x的第一个元素的索引,如果不存在这样的元素则引发错误
list.count(x): 返回列表中元素x出现的次数
list.sort(): 对列表中的元素进行排序
list.reverse(): 反转列表中的元素
>>> a=[2,3,4,5,6,7,5,32,1] >>> a.append(9) >>> print(a) [2, 3, 4, 5, 6, 7, 5, 32, 1, 9] >>> a.extend([99,999]) >>> print(a) [2, 3, 4, 5, 6, 7, 5, 32, 1, 9, 99, 999] >>> a.insert(1,9999) >>> print(a) [2, 9999, 3, 4, 5, 6, 7, 5, 32, 1, 9, 99, 999] >>> a.remove(5) >>> print(a) [2, 9999, 3, 4, 6, 7, 5, 32, 1, 9, 99, 999] >>> x=a.pop(5) >>> print(x) 7 >>> print(a.index(9999)) 1 >>> print(a.count(9)) 1 >>> a.sort() >>> print(a) [1, 2, 3, 4, 5, 6, 9, 32, 99, 999, 9999] >>> a.reverse() >>> print(a) [9999, 999, 99, 32, 9, 6, 5, 4, 3, 2, 1] >>>
- 用列表实现堆栈
堆栈功能:最后添加的元素是第一个被返回的元素。要想在堆栈顶部添加一个元素,可以使用append()方法;要想要返回堆栈顶部的元素,可以使用不指定索引参数的pop()方法
>>> stack=[3,4,5] >>> stack.append(6) >>> stack.append(7) >>> stack [3, 4, 5, 6, 7] >>> stack.pop() 7 >>> stack [3, 4, 5, 6]
- 用列表实现对列
对列功能:第一个被添加的元素第一个被返回。想要在对列尾部添加一个元素,可以使用append()方法;想要返回对列首部的元素,可以使用指定参数为0的pop()方法
>>> queue=["Eric","John","Lilian"] >>> queue.append("Terry") >>> queue ['Eric', 'John', 'Lilian', 'Terry'] >>> queue.pop(0) 'Eric' >>> queue ['John', 'Lilian', 'Terry']
- 列表推导式
列表推导式为从序列中创建列表提供了一个简单的方法。
列表推导式由包含一个表达式的括号组成,表达式后面跟随一个for子句,之后可以有零或多个for或if子句。结果是一个列表,由表达式依据其后面的for和if子句上下文计算而来的结果构成。如果希望表达式产生一个元组,则必须用括号包裹
>>> vec1=[2,4,6] >>> vec2=[4,3,-9] >>> [x*y for x in vec1 for y in vec2] [8, 6, -18, 16, 12, -36, 24, 18, -54] >>> [x+y for x in vec1 for y in vec2] [6, 5, -7, 8, 7, -5, 10, 9, -3] >>> [vec1[i]*vec2[i] for i in range(len(vec1))] [8, 12, -54] >>> [str(round(355/113,i)) for i in range(1,6)] ['3.1', '3.14', '3.142', '3.1416', '3.14159']
2. del语句
使用索引而不是值从列表中删除一个元素。与具有返回值得pop()方法不同。del语句也可以用来删除列表的一个片段或者清空整个列表
>>> a=[-1,1,3,45,6,6] >>> del a[0] >>> a [1, 3, 45, 6, 6] >>> del a[2:4] >>> a [1, 3, 6] >>> del a[:] >>> a [] >>> >>> #del也可以用来删除整个变量 >>> del a >>> a Traceback (most recent call last): File "<pyshell#68>", line 1, in <module> a NameError: name 'a' is not defined >>>
3. 元组和序列
元组由若干逗号分隔的值组成,输出时总是用括号包裹。在输入时两边的括号是可选的。
>>> t=12345,54321,'Hello!' >>> t[0] 12345 >>> t (12345, 54321, 'Hello!') >>> u=t,(1,2,3) >>> u ((12345, 54321, 'Hello!'), (1, 2, 3))
一个特殊的问题就是构造包含0或1个元素的元组:空元组由一对空括号构成,包含一个元素的元组需要在其后面跟一个逗号来构成
>>> empty=() >>> singleton='Hello', >>> len(empty) 0 >>> len(singleton) 1 >>> singleton ('Hello',) >>>
t=12345,54321,'Hello!'语句是元组封装的一个示例,值12345,54321,‘hello!’ 被封装进一个元组,其逆反操作也是可以的:
>>> t=12345,54321,'Hello!' >>> x,y,z=t >>> x 12345 >>> y 54321 >>> z 'Hello!'
4. 集合
集合就是一个包含不同元组的无序集,基本功能包括关系测试和剔除重复记录。集合对象同样支持数学操作,像联合,交,差和对称差
大括号或set()函数可以用来创建集合。注意:想要创建空集合,必须使用set()而不是{}。后者用于创建空字典
>>> basket={'apple','orange','apple','pear','orange','banana'} >>> print(basket) {'banana', 'orange', 'pear', 'apple'} >>> fruit=['apple','orange','apple','pear','orange','banana'] >>> fruit=set(basket) >>> fruit {'banana', 'orange', 'pear', 'apple'} >>> fruit={'orange','apple'} >>> fruit {'orange', 'apple'} >>> 'orange' in fruit True >>> 'crabgrass' in fruit False >>> a=set('abracadabra') >>> b=set('alacazam') >>> a {'b', 'r', 'a', 'd', 'c'} >>> a-b {'b', 'r', 'd'} >>> a|b {'b', 'c', 'a', 'd', 'l', 'm', 'r', 'z'} >>> a&b {'c', 'a'} >>> a^b {'b', 'd', 'l', 'm', 'r', 'z'} >>> a={x for x in 'abracadabra' if x not in 'abc'} >>> a {'r', 'd'}
5. 字典
与序列不同,序列式以连续的数字作为索引,而字典是以关键字作为索引。关键字可以是任意不可变类型,数字和字符串都可以作为关键字。如果元组只包含数字、字符串或元组,那么也可以作为关键字使用。不能将列表作为关键字,因为列表可以通过索引赋值、切片赋值或append(),extend()方法改变
可以将字典解释成一个无序的key:value对,其中关键字必须是互不相同的
字典的主要操作就是根据关键字来存储或获取值。同样可以使用del删除key:value对
>>> tel={'jack':4098,'sape':4139} >>> tel['guido']=4127 >>> tel {'guido': 4127, 'sape': 4139, 'jack': 4098} >>> tel['jack'] 4098 >>> del tel['sape'] >>> tel['irv']=4127 >>> tel {'guido': 4127, 'irv': 4127, 'jack': 4098} >>> list(tel.keys()) ['guido', 'irv', 'jack'] >>> sorted(tel.keys()) ['guido', 'irv', 'jack'] >>> 'guido' in tel True >>> #dict()构造函数可以直接从key-value对中创建字典: >>> dict([('sape',4139),('guido',4127),('jack',4098)]) {'guido': 4127, 'jack': 4098, 'sape': 4139} >>> # 字典推导式可以从任意的键值表达式中创建字典 >>> {x: x**2 for x in (2,4,6)} {2: 4, 4: 16, 6: 36}
6. 遍历技巧
当遍历字典时,关键字及其对应的值可以使用items()方法同时获得
>>> knights={'gallahad':'the pure','robin':'the brave'} >>> for k,v in knights.items(): print(k,v) robin the brave gallahad the pure
当遍历一个序列时,位置索引及其对应的值可以使用enumerate()函数同时获取
>>> for i, v in enumerate(['tic','tac','toe']): print(i,v) 0 tic 1 tac 2 toe
想要同时遍历两个或更多序列时,可以使用zip()函数将属性组合
>>> questions=['name','quest','favorite','color'] >>> answers=['lancelot','the holy grail','blue'] >>> for q,a in zip(questions,answers): print(q,a) name lancelot quest the holy grail favorite blue