列表
列表是可以改变的序列,所有的通用序列操作都适用,且存在一些专门的方法。
1.列表基本操作
1 #元素赋值
2 >>> x = [1,1,3]
3 >>> x[1] = 2
4 >>> x
5 [1, 2, 3]
6
7 #分片赋值
8 >>> name = list('Ryana')
9 >>> name
10 ['R', 'y', 'a', 'n', 'a']
11 >>> name[2:] = 'ita'
12 >>> name
13 ['R', 'y', 'i', 't', 'a']
2.列表方法
1)append:用于在列表末尾添加新的对象(注:直接修改原来的列表)
1 >>> list1 = [1,2,4]
2 >>> list1.append(8)
3 >>>list1
[1, 2, 4, 8]
2)count:用于统计某个元素在列表中出现的次数
1 >>> ['to','be','or','not','to','be'].count('o')
2 0
3 >>> ['to','be','or','not','to','be'].count('to')
4 2
3)extend:用于一次性在列表末尾添加另一个序列的多个值
1 >>> a = [1,2,3]
2 >>> b = [4,5,6]
3 >>> a.extend(b)
4 >>> a
5 [1, 2, 3, 4, 5, 6]
4)index:用于从列表中找出某个值第一个匹配项的索引位置
1 >>> lst = ['to','be','or','not','to','be']
2 >>> lst.index('to')
3 0
5)insert:用于将对象插于列表中,.insert(位置,元素)
1 >>> nums = [1,3,6,7]
2 >>> nums.insert(2,'5')
3 >>> nums
4 [1, 3, '5', 6, 7]
5 >>> nums.insert(2,5)
6 >>> nums
7 [1, 3, 5, '5', 6, 7]
6)pop:用于移除列表中的一个元素(默认是最后一个元素),并且返回该元素的值
1 >>> x = [1,3,5]
2 >>> x.pop()
3 5
4 >>> x.pop(0)
5 1
6 >>> x
7 [3]
7)remove:用于移除列表中某个值的第一个匹配项,不存在的元素报错
1 >>> list1 = ['to','be','or','not','to','be']
2 >>> list1.remove('be')
3 >>> list1
4 ['to', 'or', 'not', 'to', 'be']
5 >>> x.remove('bee')
6
7 Traceback (most recent call last):
8 File "<pyshell#38>", line 1, in <module>
9 x.remove('bee')
10 ValueError: list.remove(x): x not in list
8)reverse:用于将列表中的元素反向存放(注:reversed函数返回的是一个迭代器对象)
1 >>> x = [1,3,5]
2 >>> x.reverse()
3 >>> x
4 [5, 3, 1]
9)sort:用于在原始位置对列表进行排序(注:sorted函数会返回一个有序副本)
1 >>> x = [7,9,1,0,5]
2 >>> x.sort()
3 >>> x
4 [0, 1, 5, 7, 9]
10)高级排序
1 #cmp(x,y):x<y,返回负数;x>y,返回整数
2
3 >>> cmp(99,100)
4 -1
5 >>> cmp(4,1)
6 1
7
8 #key参数:为每个元素创建一个键,然后所以元素根据键来排序
9
10 >>> x = ['c++','python','go','java']
11 >>> x.sort(key=len)
12 >>> x
13 ['go', 'c++', 'java', 'python']
字典
字典是python中唯一内建的映射类型,字典中的值并没有特殊的顺序,都是存储在一个特定的键下,键可以是数字、字符串甚至是元组。
1.字典的基本操作:同序列类似
1)创建字典
1 #通过序列建立字典 2 >>> item = [('name','Ryana'),('age','12')] 3 >>> d = dict(item) 4 >>> d 5 {'age': '12', 'name': 'Ryana'} 6 7 #通过关键字参数创建字典 8 >>> d = dict(name = 'Ryana',age = '12') 9 >>> d 10 {'age': '12', 'name': 'Ryana'}
2)len(d):返回字典d的长度
3)d[k]:返回键k的值
4)d[k] = v:将值v关联到键k
5)del d[k] :删除键k的项
6)k in d :检查d是否含有键为k的项 (注:字典查找的是键,序列查找的是值,数据结构的规模越大,字典检查成员资格比列表更高效)
7)字典的键可以是任意的不可不类型,比如浮点数、字符串或者元组
8)字典格式化字符串
1 >>> phonebook = {'ann':'5570','beth':'7102'} 2 >>> "beth's phone number is %(beth)s " %phonebook 3 "beth's phone number is 7102 "
2.字典方法
1)clear:用于清除字典中的所有项,原地操作
1 >>> x = {} 2 >>> y = x 3 >>> x['key'] = 'value' 4 >>> y 5 {'key': 'value'} 6 >>> x.clear() 7 >>> x 8 {} 9 >>> y 10 {}
2)copy:返回一个具有相同键-值对的新字典,这个方法实现的是浅拷贝,浅拷贝只拷贝数据不拷贝数据之间的关系,新的数据和旧的数据使用的是同一块内存空间;深拷贝既拷贝数据又拷贝数据之间的关系,新的数据和旧的数据使用的是不同的内存空间,需要copy模块的deepcopy函数完成
1 >>> import copy 2 >>> d = {'s':'shenzhen','w':'wuhan'} 3 >>> d1 = copy.copy(d) #浅拷贝 4 >>> d1 5 {'s': 'shenzhen', 'w': 'wuhan'} 6 >>> d2 = copy.deepcopy(d) #深拷贝 7 >>> d2 8 {'s': 'shenzhen', 'w': 'wuhan'} 9 >>> d['b'] = 'beijing' #新增子项 10 >>> d1 11 {'s': 'shenzhen', 'w': 'wuhan'} 12 >>> d2 13 {'s': 'shenzhen', 'w': 'wuhan'} 14 >>> d['s'] = 'shanghai' #改变子项 15 >>> d1 16 {'s': 'shenzhen', 'w': 'wuhan'} 17 >>> d2 18 {'s': 'shenzhen', 'w': 'wuhan'}
可以发现原字典做新增或者改变子项操作,根本不影响d1和d2,都是深拷贝??再看一例:
1 >>> import copy 2 >>> d = {'s':['shenzhen','shang'],'w':'wuhan'} 3 >>> d1 = copy.copy(d) 4 >>> d1 5 {'s': ['shenzhen', 'shang'], 'w': 'wuhan'} 6 >>> d2 = copy.deepcopy(d) 7 >>> d2 8 {'s': ['shenzhen', 'shang'], 'w': 'wuhan'} 9 >>> d['b'] = 'beijing' #新增子项 10 >>> d1 11 {'s': ['shenzhen', 'shang'], 'w': 'wuhan'} 12 >>> d2 13 {'s': ['shenzhen', 'shang'], 'w': 'wuhan'} 14 >>> d['s'][1] = 'shanghai' #改变子项 15 >>> d1 16 {'s': ['shenzhen', 'shanghai'], 'w': 'wuhan'} 17 >>> d2 18 {'s': ['shenzhen', 'shang'], 'w': 'wuhan'}
发现差别了没,这次改变子项影响了d1,没影响d2。
总结:当只有一级目录,原字典的操作,对浅拷贝和深拷贝都没有影响;当目录不是一级,原字典的改变子项操作影响浅拷贝,不影响深拷贝。
3)fromkeys:使用给定的键建立新的字典
1 >>> dict.fromkeys(['name','age']) 2 {'age': None, 'name': None} 3 >>> dict.fromkeys(['name','age'],'unknown') 4 {'age': 'unknown', 'name': 'unknown'}
4)get:用来访问字典项,即使访问不存在的项也不会出错
1 >>> print d['name'] 2 3 Traceback (most recent call last): 4 File "<pyshell#74>", line 1, in <module> 5 print d['name'] 6 KeyError: 'name' 7 >>> print d.get('name') 8 None
5)items和iteritems:items将字典的所有项以列表的方式返回,iteritems作用类似,但会返回一个迭代器对象
1 >>> dict1= {'ann':'5570','beth':'7102'} 2 >>> dict1.items() 3 [('ann', '5570'), ('beth', '7102')] 4 >>> it = dict1.iteritems() 5 >>> it 6 <dictionary-itemiterator object at 0x036B3600> 7 >>> list(it) 8 [('ann', '5570'), ('beth', '7102')]
6)keys和iterkeys:keys方法将字典中的键以列表形式返回,而iterkeys返回针对键的迭代器
values和itervalues:values方法将字典中的键以列表形式返回,且可以有重复的元素,而itervalues返回针对键的迭代器
1 >>> d = {'a':'1','b':'2','c':'3'} 2 >>> d.values() 3 ['1', '3', '2'] 4 >>> d.keys() 5 ['a', 'c', 'b'] 6 >>> d.iterkeys() 7 <dictionary-keyiterator object at 0x0314D660> 8 >>> d.itervalues() 9 <dictionary-valueiterator object at 0x0314D6C0>
7)pop:用来取出对于给定键的值
1 >>> dic = {'ann':'5570','beth':'7102'} 2 >>> dic.pop('ann') 3 '5570' 4 >>> dic 5 {'beth': '7102'}
8)popitem:随机弹出字典中的一项,字典没有顺序概念
1 >>> dic = {'ann':'5570','beth':'7102','claire':'0551'} 2 >>> dic.popitem() 3 ('ann', '5570')
9)update:可以利用一个字典更新另外一个字典,若有相同的键则会覆盖
1 >>> dic1 = {'ann':'5570','beth':'7102','s':'shanghai'} 2 >>> dic2 = {'s':'shenzhen','w':'wuhan'} 3 >>> dic1.update(dic2) 4 >>> dic1 5 {'ann': '5570', 'beth': '7102', 's': 'shenzhen', 'w': 'wuhan'}
总结:列表是可变的序列,有append()、count()、extend()、index()、insert()、pop()、remove()、reverse()、sort()等方法
字典是映射类型,键值成对没有顺序,有clear()、copy()、fromkeys()、get()、pop()、update()等方法