MyPython-->基础篇-->字典

在python中 字典是一系列键值对,每个键都有一个值相关联,与键相关联的可以是数字,字符串,列表甚至python中所有的对象用作字典的值。

dict = {key:value} key表示键,value表示值,中间:串联。元素之间用","隔开

python中无论这个表有多大,查询速度都不会变慢

1 dict1 = {1:'a',2:'b'}
2 print(dict1[1])

字典用{}表示,访问字典中的值通过key调用dict[key]注意访问的时候用的也是[]。

1 et_0 = {'name':'etno_0' , 'color':'green' , 'points':'5'}
2 new_points = 0
3 new_points+=int(et_0['points'])
4 print('you beat %s ,add %s points' % (et_0['name'],et_0['points']))

第一行定义了一个叫et_0的字典,储存name,color,points信息

定义了一个变量储存分数,初始值为0

变量增加,et_0 points对应的分数

打印击败的外星人的名字,最新的分数。

添加键值对

字典是一种动态结构,可随时添加键值对

dict1[key] = value 这就是添加键值对

python中key是唯一的所有当定义key一样时,后面的会把前面的替换掉。

如果key不存在就会报错

为了防止报错,我们有两个方法

1.in

dict3 = {‘cc’:23}print('bb' in dict3)

返回一个布尔类型。

2.get方法

print(dict3.get('bb'))
print(dict3.get('bb','no bb'))

当不存在时,返回None,有时返回值

我们也可以设置第二个参数,当不存在的时候返回第二个参数。

 

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

 

创建一个空的字典

dict2 = {},需要添加值得时候再添加

修改字典中的值

1 et_0 = {'name':'etno_0' , 'color':'green' , 'points':'5'}
2 et_0['color'] = 'red'
3 print(et_0['color'])

同样的通过key来修改对应的值

 1 et_1 = {'name':'et_1','speed':'medium','x_position':0,'y_position':0}
 2 if et_1['speed'] == 'medium':
 3     et_1['x_position'] += 10
 4     et_1['y_position'] += 10
 5 elif et_1['speed'] == 'low':
 6     et_1['x_position'] += 5
 7     et_1['y_position'] += 10
 8 else:
 9     et_1['x_position'] += 15
10     et_1['y_position'] += 10
11 print('#################')
12 print(et_1['x_position'])

这里我们加了三个判断,根据speed的值来改变x_position值

删除键值对

删除,需要制定字典名和键名

 del dict[key]

del et_1[position] 这里删除后就是永久删除,其他的键值不会受到影响

遍历字典

1.遍历所有的键值对

1 print('et_1 %s' % et_1)
2 print('et_1.items %s 类型%s' % (et_1.items(),type(et_1.items()))) #([('y_position', 10), ('x_position', 10), ('speed', 'medium'), ('name', 'et_1')]) 
3 for key,value in et_1.items():
4     print('%s = %s' % (key,value))
5 for k,v in et_1.items():
6     print('%s = %s' % (key,value))

items() 方法会返回一个键值对列表,每个元素是一个元组储存着键值对。第三行就是items返回的键值对列表


那要遍历所有的key是否要

for k,v in et_1.items():
    print('%s' % k)

python给我们提供了内置的函数

for x in et_1.keys():
    print(x)

keys() 方法可以获得字典内所有的键,同样的提取value有values()方法

for v in set(et_1.values()):
    print(v)

但是我们得到的值可能会有很多重复值,这里可以用set()方法来获得无重复的值的集合

 

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

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

而list相反:

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

小练习

广告投放反馈名单,和其中参与调研的名单,名单里还有调研者年龄,对于参与调研的打印感谢,对于没有参与调研的打印邀请

1 canjia_name = ['cc','yy','lcc','notjoke']
2 canjia_dname = {'cc':23,'notjoke':22}
3 for x in canjia_name:
4     if x not in canjia_dname:
5         print('% sinvite you join our report' % x)
6     else:
7         print('thanks age = %s, %s join us '%(canjia_dname[x],x))
View Code

分析:我们需要打印所有列表内的所有人,for循环,名单中参没参与调研的打印内容不同需要区分,增加if判断。

嵌套

字典列表

 字典et_1中包含了一个外星人的各种信息,但无法储存第二个外星人的信息,这时就需要嵌套字典了 。

1 et_2 = {'name':'et_2','speed':'medium','x_position':0,'y_position':0,'points':15}
2 et_3 = {'name':'et_3','speed':'low','x_position':0,'y_position':0,'points':5}
3 et_all = [et_1,et_2,et_3]
4 for et in et_all:
5     print(et)

再来一个练习

输入一个数,生成这个数的外星人列表,随机颜色,难度分数

 1 #生成30多个外星人
 2 import random
 3 def et_make(et_num):
 4     et_color = ['red','blue','green','black']#外星人颜色
 5     et_name = []#空的外星人名字列表
 6     for x in range(0,et_num):#生成所需外星人列表名
 7         et_name.append('et_%s'%x)
 8     et_difficult = ['low','medium','difficult']#外星人难易程度列表
 9     et_points = [5,10,20]#外星人分数列表
10     et_all = []#所有外星人列表
11     for x in range(0,et_num):#for循环生成所需外星人
12         et_rnumd = random.randrange(0,len(et_difficult))
13         et_rnumc = random.randrange(0,len(et_color))
14         et ={ 'name':et_name[x] , 'color':et_color[et_rnumc] , 'difficult':et_difficult[et_rnumd] , 'points':et_points[et_rnumd] }#生成一个外星人
15         et_all.append(et)#将生成的外星人添加到et_all外星人列表内
16     return et_all#返回外星人列表
17 list1 = et_make(50)
18 for x in list1:
19     print(x)
View Code

SET

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

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

s1 = set([1,2,2,3])
print(s1)#{1,2,3}

多输入也没用,key不重复输出{1,2,3},重复元素在set中自动被过滤

添加

add(key)方法,可以重复添加但是不会有效果

s1.add('bb','gg','cc','cc')
print(s1)

删除

s1.remove(1)
print(s1)

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

提一句方法都没有改变原变量,返回的是一个新变量,所以一般都要新变量保存一下

 

posted @ 2016-08-29 15:20  notJoke  阅读(457)  评论(0编辑  收藏  举报