子钦加油

扩大
缩小

PYTHON中的字典(DICT),列表(LIST),元组(TUPLE)

一,List:列表

python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据。比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表的,以下是python列表的演示代码:

复制代码
1 >>> list1 = ['zhangxueyou','liudehua','wanglijuan','liming','shabie']
2 >>> list1
3 ['zhangxueyou', 'liudehua', 'wanglijuan', 'liming', 'shabie']
4 >>> list2 = [000001,000002,000003,000004,000005,000006]
5 >>> list2
6 [1, 2, 3, 4, 5, 6]
7 >>> 
复制代码

变量list1,list2都是一个列表的实例,可以使用len()函数获得列表的长度(字典中的元素的个数):

复制代码
 1 >>> list1 = ['zhangxueyou','liudehua','wanglijuan','liming','shabie']
 2 >>> list1
 3 ['zhangxueyou', 'liudehua', 'wanglijuan', 'liming', 'shabie']
 4 >>> list2 = [000001,000002,000003,000004,000005,000006]    #其实这里面写成字符串更合适
 5 >>> list2
 6 [1, 2, 3, 4, 5, 6]
 7 >>> len(list1)
 8 5
 9 >>> len(list2)
10 6
11 >>> 
复制代码

可以使用索引来引用列表中的元素,注意:列表中的索引是从0开始的,并且在列表中还支持负索引,实例如下:

复制代码
 1 >>> list1[0]
 2 'zhangxueyou'
 3 >>> list1[2]
 4 'wanglijuan'
 5 >>> list2[1]
 6 2
 7 >>> list1[-1]
 8 'shabie'
 9 >>> list2[-2] #这就是负索引的实例
10 5
11 >>> 
复制代码

当访问的下标越界的时候就会报Index error错:

1 >>> list1[78]
2 Traceback (most recent call last):
3   File "<stdin>", line 1, in <module>
4 IndexError: list index out of range
5 >>> 

所以,记得在操作python的列表的时候不要越界,记得最后一个元素的索引是:len(list1)-1.

当你要取得最后一个元素的时候你除了记住索引之外还有一个更机智的办法即使使用python的负索引的方法:

1 >>> list1[len(list1)-1]
2 'shabie'
3 >>> list1[-1]
4 'shabie'
5 >>> 

list是一个可以变的有序列表,因此可以往你自己的列表中添加和删除元素:在末尾添加元素用的是append()方法,在指定的位置插入元素使用的是insert()方法。

复制代码
 1 #在列表末尾追加元素
 2 >>> list1.append('***')
 3 >>> list1
 4 ['zhangxueyou', 'liudehua', 'wanglijuan', 'liming', 'shabie', '***']
 5 >>> list2.append(7)
 6 >>> list2
 7 [1, 2, 3, 4, 5, 6, 7]
 8 >>> 
 9  #也可以在指定的位置上添加元素
10 ... 
11 >>> list1.insert(1,'luoting')
12 >>> list1
13 ['zhangxueyou', 'luoting', 'liudehua', 'wanglijuan', 'liming', 'shabie', '***']
14 >>> list2.insert(0,8)
15 >>> list2
16 [8, 1, 2, 3, 4, 5, 6, 7]
17 >>> 
复制代码

在列表中删除元素:删除末尾的元素使用的是pop()方法,删除指定位置的元素使用pop(i),其中i是索引下标,

复制代码
 1 >>> list1
 2 ['zhangxueyou', 'luoting', 'liudehua', 'wanglijuan', 'liming', 'shabie', '***']
 3 >>> list1.pop()
 4 '***'
 5 >>> list1
 6 ['zhangxueyou', 'luoting', 'liudehua', 'wanglijuan', 'liming', 'shabie']
 7 >>> 
 8 >>> list1.pop(0)
 9 'zhangxueyou'
10 >>> list1
11 ['luoting', 'liudehua', 'wanglijuan', 'liming', 'shabie']
12 >>> list2.pop()
13 7
14 >>> list2
15 [9, 8, 1, 2, 3, 4, 5, 6]
16 >>> list2.pop(0)
17 9
18 >>> list2
19 [8, 1, 2, 3, 4, 5, 6]
20 >>> 
复制代码

若想替换list中的某个元素,可以直接把该元素赋值给对应的元素下标即可:

1 >>> list1
2 ['luoting', 'liudehua', 'wanglijuan', 'liming', 'shabie']
3 >>> list1[2] = "wyl"
4 >>> list1
5 ['luoting', 'liudehua', 'wyl', 'liming', 'shabie']
6 >>> 

在一个list中可以有不同的数据类型,可以有字符串类型,整型,或者bool等。

1 >>> list3 = ['baba','mama',123,True]
2 >>> list3
3 ['baba', 'mama', 123, True]
4 >>> 

list的元素中也可以有另外一个list,就相当于一个循环的嵌套一样。

1 >>> list4 = ['wang','wu','luo',['lang','luo','zhang'],'kua']
2 >>> list4
3 ['wang', 'wu', 'luo', ['lang', 'luo', 'zhang'], 'kua']
4 >>> 

在这个列表中,要取到‘lang’可以使用下标索引:list4[3][1],这就相当于c语言中的二维数组,同样的还可以层层递进的写到三维数组,四维数组等。

 1 >>> list4[3][1] 2 3 'luo' 4 5 >>>  

如果,一个列表中一个元素都都没有的话,就是一盒空列表:

 1 >>> 2 >>> list5 = [] 3 >>> len(list5) 4 0 5 >>>  

 

python列表的高级应用:

1.用某个固定的值初始化列表:

复制代码
1 >>> initial_value = 0
2 >>> list_length = 5
3 >>> sample_list = [initial_value for i in range(10)]
4 >>> sample_list = [initial_value]*list_length
5 >>> sample_list
6 [0, 0, 0, 0, 0]
7 >>> 
复制代码

2.产生一个数制递增的列表:

1 >>> num_inc_list = range(30)
2 >>> num_inc_list
3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
4 >>> 

3.创建连续的list
 L = range(1,5)      #即 L=[1,2,3,4],不含最后一个元素
 L = range(1, 10, 2) #即 L=[1, 3, 5, 7, 9]

复制代码
1 >>> L = range(1,5)
2 >>> L
3 [1, 2, 3, 4]
4 >>> L = range(1,20,3)
5 >>> L
6 [1, 4, 7, 10, 13, 16, 19]
7 >>> 
复制代码

list的方法
L.append(var)   #追加元素
L.insert(index,var)
L.pop(var)      #返回最后一个元素,并从list中删除之
L.remove(var)   #删除第一次出现的该元素

复制代码
1 >>> list6 = [1,2,3,4,5,6,4,5,12,65,4]
2 >>> list6
3 [1, 2, 3, 4, 5, 6, 4, 5, 12, 65, 4]
4 >>> list6.remove(4)
5 >>> list6
6 [1, 2, 3, 5, 6, 4, 5, 12, 65, 4]
7 >>> 
复制代码

L.count(var)    #该元素在列表中出现的个数

复制代码
 1 >>> list6 = [1,2,3,4,5,6,4,5,12,65,4]
 2 >>> list6
 3 [1, 2, 3, 4, 5, 6, 4, 5, 12, 65, 4]
 4 >>> list6.remove(4)
 5 >>> list6
 6 [1, 2, 3, 5, 6, 4, 5, 12, 65, 4]
 7 >>> 
 8 >>> list6.count(4)
 9 2
10 >>> 
复制代码

L.index(var)    #该元素的位置,无则抛异常 

复制代码
1 >>> list6
2 [1, 2, 3, 5, 6, 4, 5, 12, 65, 4]
3 >>> 
4 >>> list6.count(4)
5 2
6 >>> list6.index(5)
7 3
8 >>> 
复制代码

L.extend(list6)  #追加list6,即合并list到L上

1 >>> L
2 [1, 4, 7, 10, 13, 16, 19]
3 >>> L.extend(list6)
4 >>> L
5 [1, 4, 7, 10, 13, 16, 19, 1, 2, 3, 5, 6, 4, 5, 12, 65, 4]
6 >>> 

这里注意,使用extend函数可以一次在一个列表中插入任意多个值,而不必须每次只使用append()一次一值的插入:

L.sort()        #排序

L.reverse()     #倒序

复制代码
1 >>> L
2 [1, 4, 7, 10, 13, 16, 19, 1, 2, 3, 5, 6, 4, 5, 12, 65, 4]
3 >>> L.sort()
4 >>> L
5 [1, 1, 2, 3, 4, 4, 4, 5, 5, 6, 7, 10, 12, 13, 16, 19, 65]
6 >>> L.reverse()
7 >>> L
8 [65, 19, 16, 13, 12, 10, 7, 6, 5, 5, 4, 4, 4, 3, 2, 1, 1]
9 >>> 
复制代码

list 操作符:,+,*,关键字del

a[1:]       #片段操作符,用于子list的提取
[1,2]+[3,4] #为[1,2,3,4]。同extend()
[2]*4       #为[2,2,2,2]
del L[1]    #删除指定下标的元素
del L[1:3]  #删除指定下标范围的元素

复制代码
1 >>> L
2 [65, 19, 16, 13, 12, 10, 7, 6, 5, 5, 4, 4, 4, 3, 2, 1, 1]
3 >>> del L[1]
4 >>> L
5 [65, 16, 13, 12, 10, 7, 6, 5, 5, 4, 4, 4, 3, 2, 1, 1]
6 >>> del L[0:3]
7 >>> L
8 [12, 10, 7, 6, 5, 5, 4, 4, 4, 3, 2, 1, 1]
9 >>> 
复制代码

复制list:

L1 = L      #L1为L的别名,用C来说就是指针地址相同,对L1操作即对L操作。函数参数就是这样传递的
L1 = L[:]   #L1为L的克隆,即另一个拷贝。

 1 >>> l1 = L 2 >>> l1 3 [12, 10, 7, 6, 5, 5, 4, 4, 4, 3, 2, 1, 1] 4 >>> l1 = L[:] 

 

二,Tuple:元组

和列表类似,元组也是一种有序列表,虽然tuple和list非常之类似,但是list初始化之后使可以改变的,但是,元组一旦初始化之后就不可以改变。比如,同样的列出一组人的姓名:

1 >>> tuple1 = ('wuyanl','wangcc','wanggang','dengdacheng')
2 >>> tuple1
3 ('wuyanl', 'wangcc', 'wanggang', 'dengdacheng')
4 >>> 

现在tuple1这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用tuple1[0],tuple1[-1],但不能赋值成另外的元素。

不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

复制代码
1 >>> tuple1[0]
2 'wuyanl'
3 >>> tuple1[-1]
4 'dengdacheng'
5 >>> tuple1[4]
6 Traceback (most recent call last):
7   File "<stdin>", line 1, in <module>
8 IndexError: tuple index out of range
9 >>> #同样越界也是报出一个indexError
复制代码

tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:

复制代码
 1 >>> #定义一个空的元组
 2 ... 
 3 >>> t = tuple()
 4 >>> t
 5 ()
 6 >>> t = (1,2,3,1)
 7 >>> t
 8 (1, 2, 3, 1)
 9 >>> #定义一个只有一个元素的元组,可以这样定义:
10 ... 
11 >>> t1 = (123,)
12 >>> t1
13 (123,)
14 >>> #如果你这样定义你定义的将是123这个元素,而不是一个元组
15 >>> 
16 >>> t2 = (123)
17 >>> t2
18 123
19 >>> 
复制代码

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。

 可以"改变"的tuple:

复制代码
1 >>> tuple2 = ('aa','bb','cc',['a','b','c'],'dd')
2 >>> tuple2
3 ('aa', 'bb', 'cc', ['a', 'b', 'c'], 'dd')
4 >>> tuple2[3][0] = 'XX'
5 >>> tuple2[3][1] = 'YY'
6 >>> tuple2
7 ('aa', 'bb', 'cc', ['XX', 'YY', 'c'], 'dd')
8 >>> #当一个元组中有列表时是可以改变元组的值的,其实实质是改变列表的值
复制代码

1.创建元组:

复制代码
 1 >>> tuple1 = ('wudashen','langdacheng','wangchengcheng')
 2 >>> tuple2 = (1,2,3,4,5,6)
 3 >>> tuple3 = "a","b","c","d"
 4 >>> tuple1
 5 ('wudashen', 'langdacheng', 'wangchengcheng')
 6 >>> tuple2
 7 (1, 2, 3, 4, 5, 6)
 8 >>> tuple3
 9 ('a', 'b', 'c', 'd')
10 >>> 
复制代码

创建一个空元组时可以直接创建一个括号,创建一个只有一个元素的元组时,必须在和面添加一个逗号(,):

复制代码
>>> 
>>> tuple4 = ()
>>> tuple4
()
>>> tuple5 = (1,)
>>> tuple5
(1,)
>>> 
复制代码

元组与字符串类似,下标索引从0开始,可以进行截取,组合等。

2.访问元组:

元组可以使用下标索引来访问元组中的值,如下实例:

复制代码
1 >>> print "tuple1[0]:",tuple1[0]
2 tuple1[0]: wudashen
3 >>> print "tuple1[1:5]",tuple1[1:5]
4 tuple1[1:5] ('langdacheng', 'wangchengcheng')
5 >>> print "tuple2[1:5]",tuple2[1:5]
6 tuple2[1:5] (2, 3, 4, 5)
7 >>> 
复制代码

3.修改元组:

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

复制代码
 1 >>> t1 = ('wuyanl','luoting','aimeiyu')
 2 >>> t2 = (1,2,3,4,5,6,7,8,9,0)
 3 >>> t1 
 4 ('wuyanl', 'luoting', 'aimeiyu')
 5 >>> t2
 6 (1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
 7 >>> t3 = t1 +t2
 8 >>> t3
 9 ('wuyanl', 'luoting', 'aimeiyu', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
10 >>> 
复制代码

4.删除元组:

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

复制代码
1 >>> print t1
2 ('wuyanl', 'luoting', 'aimeiyu')
3 >>> del t1
4 >>> t1
5 Traceback (most recent call last):
6   File "<stdin>", line 1, in <module>
7 NameError: name 't1' is not defined
8 >>> 
复制代码

5.元组运算符:

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

 

6.元组索引,截取:

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

7. 元组的内置函数:

 (1),比较两个元组元素:cmp(tuple1,tuple2)

复制代码
 1 >>> tuple1
 2 ('wudashen', 'langdacheng', 'wangchengcheng')
 3 >>> tuple2
 4 (1, 2, 3, 4, 5, 6)
 5 >>> cmp(tuple1,tuple2)
 6 1
 7 >>> #两个元组不相等则返回1
 8 ... 
 9 >>> tt1 = (1,2,3)
10 >>> tt1
11 (1, 2, 3)
12 >>> tt2 = (1,2,3)
13 >>> tt2
14 (1, 2, 3)
15 >>> cmp(tt1,tt2)
16 0
17 >>> #两个元组相等则返回0
18 ... 
19 >>> 
复制代码

(2),计算元组的长度:len(tuple1):

复制代码
1 >>> len(tt1)
2 3
3 >>> len(tt2)
4 3
5 >>> len(tuple1)
6 3
7 >>> len(tuple2)
8 6
9 >>> 
复制代码

(3),返回元组中的最大值:max(tuple2),min(tuple2)

复制代码
 1 >>> 
 2 >>> max(tt1)
 3 3
 4 >>> max(tuple1)
 5 'wudashen'
 6 >>> max(tuple2)
 7 6
 8 >>> max(tuple3)
 9 'd'
10 >>> min(tt1)
11 1
12 >>> min(tuple3)
13 'a'
14 >>> #返回元组中的最小值
复制代码

(4),将列表转换成元组:

1 >>> list1
2 ['luoting', 'liudehua', 'wyl', 'liming', 'shabie']
3 >>> lt = tuple(list1)
4 >>> lt
5 ('luoting', 'liudehua', 'wyl', 'liming', 'shabie')
6 >>> 

元组的知识就先介绍到这里,以下详细的来说一下重头戏--字典:

三,Dict:字典

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

在这里可以举一个例子,假如你通过列表来查看工人的名字和对应的工资的话,在这里你需要设置两个列表,一个用于存储名字,一个用于存储工资:

复制代码
1 >>> name = ['zhangsan','lisi','wangwu','doubie']
2 >>> name
3 ['zhangsan', 'lisi', 'wangwu', 'doubie']
4 >>> salary = [20000,30000,200000,123000]
5 >>> salary
6 [20000, 30000, 200000, 123000]
7 >>> 
复制代码

给定一个名字,要查找对应的成绩,就先要在name中找到对应的位置,再从salary取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“薪水”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。

用Python写一个dict如下:

1 >>> dict1 = {'zhangsan':30000,'lisi':321000,'wanger':123654,'wangwu':123878}
2 >>> dict1
3 {'lisi': 321000, 'zhangsan': 30000, 'wanger': 123654, 'wangwu': 123878}
4 >>> 

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。

第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字,无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

dict就是第二种实现方式,给定一个名字,比如'zhangsan',dict在内部就可以直接计算出zhangsanl对应的存放成绩的“页码”,也就是30000这个数字存放的内存地址,直接取出来,所以速度非常快。

你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

复制代码
 1 >>> dict1 = {'zhangsan':30000,'lisi':321000,'wanger':123654,'wangwu':123878}
 2 >>> dict1
 3 {'lisi': 321000, 'zhangsan': 30000, 'wanger': 123654, 'wangwu': 123878}
 4 >>> dict1['zhangsan']
 5 30000
 6 >>> dict1['wangwu']
 7 123878
 8 >>> dict1['lisi']
 9 321000
10 >>> 
复制代码

油魚一個key只能對應一个值,因此,倘若你多次对同一个key赋值的话,以前赋的值会被覆盖掉。

复制代码
1 >>> dict1
2 {'lisi': 321000, 'zhangsan': 30000, 'wanger': 123654, 'wangwu': 123878}
3 >>> dict1['zhangsan'] = 1000000
4 >>> dict1
5 {'lisi': 321000, 'zhangsan': 1000000, 'wanger': 123654, 'wangwu': 123878}
6 >>> dict1['zhangsan'] = 100
7 >>> dict1
8 {'lisi': 321000, 'zhangsan': 100, 'wanger': 123654, 'wangwu': 123878}
9 >>> 
复制代码

如果你想赋值的key不存在就会报错:

复制代码
 1 >>> dict1['***'] = 4563221
 2 >>> dict1
 3 {'lisi': 321000, '***': 4563221, 'zhangsan': 100, 'wanger': 123654, 'wangwu': 123878}
 4 >>> dict1['wangcc']
 5 Traceback (most recent call last):
 6   File "<stdin>", line 1, in <module>
 7 KeyError: 'wangcc'
 8 >>> dict1['wyl'] = 888888
 9 >>> dict1
10 {'wanger': 123654, '***': 4563221, 'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
11 >>> 
复制代码

由以上的代码可以看出,当你的字典中没有这个key,但是你还给这个key赋值的话,是不会报错的,并且你的值可以插入这个字典中,但是假如你访问一个没有的key值,就会报出一个KeyError,

 因此,要想判断key值是否存在,可以有两个方法。

方法一:使用in语句判断:

复制代码
1 >>> dict1
2 {'wanger': 123654, '***': 4563221, 'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
3 >>> 'zhangsan' in dict1
4 True
5 >>> 'liudehua' in dict1
6 False
7 >>> dict1
复制代码

方法二:使用dict提供的get()方法,若key值不存在就返回None或者自己指定的返回值:

1 >> dict1
2 {'wanger': 123654, '***': 4563221, 'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
3 >>> dict1.get('zhangdada','not any')
4 'not any'
5 >>> #使用自己定义的返回值
复制代码
1 >>> dict1
2 {'wanger': 123654, '***': 4563221, 'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
3 >>> 
4 >> dict1.get('zhangsan')
5 100
6 >>> dict1.get('xielaoda')
7 >>> #什么都没有返回(NONE)
8 ... 
9 >>> 
复制代码

注意:返回None的时候Python的交互式命令行不显示结果。

和列表和元组类似,当你要删除一个字典值的时候,你可以使用pop(key)的方法达到删除字典元素的目的:

复制代码
 1 >>> dict1
 2 {'wanger': 123654, '***': 4563221, 'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
 3 >>> dict1.pop('wanger')
 4 123654
 5 >>> dict1
 6 {'***': 4563221, 'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
 7 >>> dict1.pop('***')
 8 4563221
 9 >>> dict1
10 {'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
11 >>> 
复制代码

注意,dict内部存放的顺序和key放入的顺序是没有关系的。

和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而增加;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

 

字典的高级应用:

复制代码
 1 >>> dict2 = {'a':1,'b':2,'c':3}
 2 >>> dict2
 3 {'a': 1, 'c': 3, 'b': 2}
 4 >>> dict3 = dict2
 5 >>> dict3
 6 {'a': 1, 'c': 3, 'b': 2}
 7 >>> del dict2['a'] #删除key为'a'的条目
 8 >>> dict2
 9 {'c': 3, 'b': 2}
10 >>> dict2.clear()
11 >>> dict2.clear()
12 >>> dict2.clear()#清空字典;
13 >>> dict2
14 {}
15 >>> del dict2 #直接删除整个字典
16 >>> dict2
17 Traceback (most recent call last):
18   File "<stdin>", line 1, in <module>
19 NameError: name 'dict2' is not defined
20 >>> #删除之后再输出dict2字典确实出错了
21 ... 
22 >>> 
复制代码

字典键的特性:

(1),在字典中同一个key不可以出现两次或以上:

1 >>> dict4 = {'name':123,'name':1236}
2 >>> dict4
3 {'name': 1236}
4 >>> #两次设置name但是只显示一次

(2),键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行,如下实例:换言之就是

1 >>> dict4 = {'name1':123,'name2':1236,'name3':1}
2 >>> dict4
3 {'name2': 1236, 'name3': 1, 'name1': 123}
4 >>> 

字典的内置函数和方法:

(1),字典中的cmp函数用于比较两个字典是不是相等的:

复制代码
1 >>> dic1 = {'a':1,'b':2,'c':3}
2 >>> dic2 = dic1
3 >>> dic3 = {'e':3,'r':5,'y':7}
4 >>> cmp(dic1,dic2)
5 0
6 >>> cmp(dic2,dic3)
7 -1
8 >>> #两个字典比较,如果相同就返回0 否则返回-1
9 ... #cmp函数就是用于比较两个字典是不是相等的字典内置函数
复制代码

(2),len(dict):计算字典元素个数,即键的总数。

复制代码
1 >>> len(dic1)
2 3
3 >>> len(dic2)
4 3
5 >>> len(dic3)
6 3
7 >>> len(dict1)
8 4
9 >>> 
复制代码

(3),str(dict):输出字典可打印的字符串表示。

复制代码
1 >>> str(dic1)
2 "{'a': 1, 'c': 3, 'b': 2}"
3 >>> str(dic2)
4 "{'a': 1, 'c': 3, 'b': 2}"
5 >>> str(dic3)
6 "{'y': 7, 'r': 5, 'e': 3}"
7 >>> str(dict1)
8 "{'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}"
9 >>> 
复制代码

(4),type(variable):返回输入的变量类型,如果变量是字典就返回字典类型。

复制代码
1 >>> type(dic1)
2 <type 'dict'>
3 >>> type(dic2)
4 <type 'dict'>
5 >>> type(dict1)
6 <type 'dict'>
7 >>> 
复制代码

 

Python字典包含了以下内置方法:
1、radiansdict.clear():删除字典内所有元素

1 >>> dic1
2 {'a': 1, 'c': 3, 'b': 2}
3 >>> dic1.clear()
4 >>> dic1
5 {}
6 >>> 

2、radiansdict.copy():返回一个字典的浅复制

复制代码
1 >>> dic3
2 {'y': 7, 'r': 5, 'e': 3}
3 >>> dic3.copy()
4 {'y': 7, 'r': 5, 'e': 3}
5 >>> dic3
6 {'y': 7, 'r': 5, 'e': 3}
7 >>> 
复制代码

3、radiansdict.fromkeys():创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

4、radiansdict.get(key, default=None):返回指定键的值,如果值不在字典中返回default值

1 >>> dict1.get('zhangxueyou','not any')
2 'not any'
3 >>> 

5、radiansdict.has_key(key):如果键在字典dict里返回true,否则返回false

复制代码
1 >>> dict1
2 {'lisi': 321000, 'wangwu': 123878, 'wyl': 888888, 'zhangsan': 100}
3 >>> dict1.has_key('wangwu')
4 True
5 >>> dict1.has_key('wang')
6 False
7 >>> 
复制代码

6、radiansdict.items():以列表返回可遍历的(键, 值) 元组数组

1 >>> dict1.items()
2 [('lisi', 321000), ('wangwu', 123878), ('wyl', 888888), ('zhangsan', 100)]
3 >>> 

7、radiansdict.keys():以列表返回一个字典所有的键

1 >>> list2 = {'a':1,'b':2,'c':3,'d':4}
2 >>> list2
3 {'a': 1, 'c': 3, 'b': 2, 'd': 4}
4 >>> list2.keys()
5 ['a', 'c', 'b', 'd']
6 >>> 

8、radiansdict.setdefault(key, default=None):和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default

9、radiansdict.update(dict2):把字典dict2的键/值对更新到dict里

10、radiansdict.values():以列表返回字典中的所有值

1 >>> list2
2 {'a': 1, 'c': 3, 'b': 2, 'd': 4}
3 >>> list2.values()
4 [1, 3, 2, 4]
5 >>> 

四,set

本来,打算只讲一下字典,元组,列表的一些基本用法,但是现在扩展探讨一下python中的set的用法:

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

要创建一个set,需要提供一个list作为输入集合:

 1 >>> s = set([1,2,3,4,5,6,7,8,9]) 2 >>> s 3 set([1, 2, 3, 4, 5, 6, 7, 8, 9]) 4 >>>  

注意,传入的参数[1, 2, 3]是一个list,而显示的set([1, 2, 3])只是告诉你这个set内部有1,2,3这3个元素,显示的[]不表示这是一个list。

重复元素在set中自动被过滤:

复制代码
1 >>> s = set([1,2,3,4,5,6,7,8,9])
2 >>> s
3 set([1, 2, 3, 4, 5, 6, 7, 8, 9])
4 >>> s = set([1,2,3,4,5,6,7,8,9,1,2,3,3,4,5,6,7,89,97,7])
5 >>> s
6 set([1, 2, 3, 4, 5, 6, 7, 8, 9, 97, 89])
7 >>> 
复制代码

这一点,有点想数学中的集合的互异性类似。

在此,你还可以使用add()方法添加元素到set找你刚,当你重复添加的时候是不会报错的,只是不会在set中看到重复的值,它会自己过虐掉的。

复制代码
1 >>> s
2 set([1, 2, 3, 4, 5, 6, 7, 8, 9, 97, 89])
3 >>> s.add(100)
4 >>> s.add(100)
5 >>> s.add(123)
6 >>> s.add(321)
7 >>> s
8 set([1, 2, 3, 4, 5, 6, 7, 8, 9, 321, 97, 89, 123, 100])
9 >>> 
复制代码

若你想删除set中的值,你可以使用方法remove(key)达到你想要的效果。

1 >>> s
2 set([1, 2, 3, 4, 5, 6, 7, 8, 9, 321, 97, 89, 123])
3 >>> s.remove(1)
4 >>> s
5 set([2, 3, 4, 5, 6, 7, 8, 9, 321, 97, 89, 123])
6 >>> 

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

复制代码
 1 >>> s1 = set([1,2,3,4,5,6,7,8,9])
 2 >>> s1
 3 set([1, 2, 3, 4, 5, 6, 7, 8, 9])
 4 >>> s2 = set([4,2,3,6])
 5 >>> s2
 6 set([2, 3, 4, 6])
 7 >>> s1 & s2
 8 set([2, 3, 4, 6])
 9 >>> s1 | s2
10 set([1, 2, 3, 4, 5, 6, 7, 8, 9])
11 >>> 
复制代码

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。

 

转载自:https://www.cnblogs.com/blogofwyl/p/4284131.html

posted on 2019-10-12 11:14  子钦加油  阅读(428)  评论(0编辑  收藏  举报

导航

返回顶部