基础知识回顾——列表和字典

列表

列表是可以改变的序列,所有的通用序列操作都适用,且存在一些专门的方法。

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()等方法

原文地址:https://www.cnblogs.com/Ryana/p/5971161.html